Simak cara berikut ini
- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
Dengan kata kunci baru nonnull
dan nullable
anotasi kita dapat memperkayanya sebagai berikut:
- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;
tapi kami juga mendapatkan peringatan ini:
Pointer tidak memiliki penentu jenis nullability (__nonnull atau __nullable)
Ini mengacu pada parameter ketiga (blok satu).
The dokumentasi tidak mencakup dengan contoh-contoh bagaimana menentukan nullability parameter blok. Ini menyatakan kata demi kata
Anda bisa menggunakan formulir yang tidak digarisbawahi nullable dan nonnull segera setelah kurung buka, selama tipenya adalah objek sederhana atau penunjuk blok.
Saya mencoba meletakkan salah satu dari dua kata kunci untuk blok (di posisi apa pun) tanpa hasil. Juga mencoba varian yang diawali garis bawah ( __nonnull
dan __nullable
).
Oleh karena itu pertanyaan saya adalah: bagaimana saya dapat menentukan semantik nullability untuk parameter blok?
sumber
NSError **
tipe? Sepertinya saya tidak bisa membuat kompiler senang.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=25Menurut Blog Apple ("Nullability and Objective-C") , Anda dapat menggunakan
NS_ASSUME_NONNULL_BEGIN
danNS_ASSUME_NONNULL_END
.Dalam wilayah ini, semua jenis penunjuk sederhana akan dianggap sebagai
nonnull
. Kemudian Anda bisa menambahkannullable
objek nullable, sepertiNSError **
jenis, harusNSError * _Nullable * _Nullable
id *
tipe, lebih baik gunakanid _Nullable * _Nonnull
, itu tergantung (mungkin Anda menginginkan_Nullable id * _Nullable
tipe).NSObject *
bertipe, Anda perlu menambahkan anotasi setelah pointer, seperti iniNSObject * _Nullable * _Nonnull
Catatan
_Nonnull
dan_Nullable
harus digunakan setelah penunjuk atauid
(Apple melakukannya dalam kode contohAAPLListItem * _Nullable
), tetapi bentuk yang tidak digarisbawahinonnull
dannullable
dapat digunakan setelah kurung buka.periksa lebih lanjut di "Nullability dan Objective-C"
Yang
_Nullable id * _Nonnull
bisa dibingungkan,id _Nullable * _Nonnull
adalah pemahaman yang lebih baik._Nonnull
dan_Nullable
harus digunakan setelah penunjuk atauid
(Apple melakukannya dalam kode contohAAPLListItem * _Nullable
)sumber
Anda juga bisa melakukan seperti ini:
Itu hanya tergantung sintaks mana yang lebih Anda sukai.
sumber
Untuk menentukan penyelesaian di file header saya melakukan ini
Tentu saja, saya setuju dengan jawaban yang diterima.
sumber
Dari blog pengembang apel : Inti: _Nullable dan _Nonnull
sumber
Inilah yang telah saya gunakan untuk kasus NSError **:
sumber
NSError **
, Anda tidak perlu menentukan nullability-nya.