5

Piszę zestaw narzędzi w Objective-C, które będą używane przez Swift w pewnym momencie, używam generics i nullability. Co powinienem zrobić w tej sytuacji?NSError, Swift i nullability

- (NSArray<MyObj *> * __nullable)foo:(NSError **)error; 

Obecnie dostaję ostrzeżenie: Pointer is missing a nullability type specifier... dla obu wskaźników! Jestem prawie pewien, że NIE powinienem:

- (NSArray<MyObj *> * __nullable)foo:(NSError * __autoreleasing __nullable * __nullable)error; 

Czy jestem?

Odpowiedz

18

Swift wpisu na blogu Nullability and Objective-C stany:

Szczególny rodzaj NSError ** jest tak często używany do powrotu błędów poprzez parametrów metody jest to, że zawsze zakłada się pustych wskaźnik do wartości pustych NSError odniesienia.

Jednak uwaga ta znajduje się na liście jako wyjątek od zasad z „Zbadane Regionów” i wydaje się, że ma on zastosowanie wyłącznie w region zbadane:

NS_ASSUME_NONNULL_BEGIN 

@interface MyClass : NSObject 
- (NSArray<MyObj *> * _Nullable)foo:(NSError **)error; 
@end 

NS_ASSUME_NONNULL_END 

obrębie obszaru kontrolowanego, każdy prosty typ wskaźnika będzie przyjmowany jako nonnull (z pewnymi wyjątkami, jak wyżej wspomniane dla NSError).

Poza w badanym regionie, to rzeczywiście trzeba pisać wyraźnie

- (NSArray<MyObj *> * _Nullable)foo:(NSError * _Nullable * _Nullable)error; 

uniknąć ostrzeżenia o brakujące specyfikatory typu wartości null.

(_Nullable jest nowszy Składnia w Xcode 7 i zastępuje __nullable).