Rozważ następującą metodę
- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
Dzięki nowym słowom kluczowymnonnull
i nullable
adnotacjom możemy go wzbogacić w następujący sposób:
- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
ale otrzymujemy również to ostrzeżenie:
We wskaźniku brakuje specyfikatora typu dopuszczalności wartości null (__nonnull lub __nullable)
Odnosi się do trzeciego parametru (blokowego).
Dokumentacja nie obejmuje przykłady jak określić opcje dopuszczania wartości null parametrów bloku. Mówi dosłownie
Formularz nie podkreślonych można używać bezpośrednio po otwartym nawiasie, o ile typ jest prostym obiektem lub wskaźnikiem do bloku.
Próbowałem umieścić jedno z dwóch słów kluczowych dla bloku (w dowolnej pozycji) bez powodzenia. Wypróbowałem także warianty z przedrostkiem podkreślonym ( __nonnull
i __nullable
).
Dlatego moje pytanie brzmi: jak mogę określić semantyczną wartość zerową dla parametrów bloku?
źródło
NSError **
typem? Wydaje się, że nie mogę uszczęśliwić kompilatora.The particular type NSError ** is so often used to return errors via method parameters that it is always assumed to be a nullable pointer to a nullable NSError reference.
developer.apple.com/swift/blog/?id=25Według Apple Blog („Nullability and Objective-C”) możesz użyć
NS_ASSUME_NONNULL_BEGIN
iNS_ASSUME_NONNULL_END
.W tych regionach przyjmuje się, że każdy prosty typ wskaźnika jest
nonnull
. Następnie możesz po prostu dodaćnullable
obiekt dopuszczający wartość null, taki jakNSError **
typem, powinien byćNSError * _Nullable * _Nullable
id *
typem, lepiej użyjid _Nullable * _Nonnull
, to zależy (może chcesz_Nullable id * _Nullable
typ).NSObject *
typem, musisz umieścić adnotację po wskaźniku, w ten sposóbNSObject * _Nullable * _Nonnull
Uwaga
_Nonnull
i_Nullable
powinien być używany po wskaźniku lubid
(Apple robi to w przykładowym kodzieAAPLListItem * _Nullable
), ale formularze bez podkreślenianonnull
inullable
mogą być używane po otwartym nawiasie.zobacz więcej w „Nullability and Objective-C”
_Nullable id * _Nonnull
Może być mylony,id _Nullable * _Nonnull
jest lepsze zrozumienie._Nonnull
i_Nullable
powinien być używany po wskaźniku lubid
(Apple robi to w przykładowym kodzieAAPLListItem * _Nullable
)źródło
Możesz też zrobić tak:
Zależy to tylko od tego, którą składnię lubisz bardziej.
źródło
Aby zdefiniować uzupełnienia w pliku nagłówkowym, zrobiłem to
Oczywiście zgadzam się z zaakceptowaną odpowiedzią.
źródło
Z bloga programistów Apple : The Core: _Nullable and _Nonnull
źródło
Oto, czego użyłem w przypadku NSError **:
źródło
NSError **
nie musisz określać jego wartości zerowej.