Само по себе есть предупреждение только в чрезвычайно тривиальном случае: когда вы передаете nil
функции, принимающей значение _Nonnull
.
NSObject* _Nonnull test(NSObject* _Nonnull) {
test(nil); // warning
NSObject* _Nullable f = nil;
test(f); // no warning (passing _Nullable to _Nonnull), only warn in static analysis
NSObject* _Nonnull g = [[NSObject alloc] init];
g = nil; // no warning (!) (assigning nil to _Nonnull)
if (g != nil) { // no warning (unnecessary '!= nil' comparison)
test(g);
}
return nil; // no warning (returning nil to _Nonnull)
}
(Существует -Wnullable-to-nonnull-conversion
flag но это, кажется, не оказывает никакого влияния на код выше.)
As documented, три атрибута не изменит поведение кода :
... Обратите внимание, что, в отличие от атрибута декларации nonnull
, наличие _Nonnull
не означает, что передача null - это неопределенное поведение.: fetch
может свободно рассматривать неопределенное поведение или (возможно, по соображениям обратной совместимости) защитный дескриптор.
Помимо компилятора, это также поможет статический анализатор, но снова лязг статику анализатор только поймать тривиальный случай, когда он знает, что вы присваиваете nil
к _Nonnull
(т.е. test(f)
пример выше).
Тем не менее, он по-прежнему полезно отметить указатель _Nonnull
/_Nullable
, как
- документации;
- Позвольте разработчикам Swift лучше использовать вашу библиотеку;
- компилятор будет выдавать предупреждения везде, если не добавить эти аннотации
Если один использовать '' _Nonnull'/_Nullable' вместо ''/nonnull' nullable'? Кажется, вы предпочитаете вариант подчеркивания, не могли бы вы объяснить, почему? Я лично считаю, что «nonnull» и «nullable» легче читать, и следующая статья в Swift-блоге, по-видимому, предлагает последнее по сравнению с предыдущим как более приятную альтернативу: https://developer.apple.com/swift/blog/?id = 25 – iosdude
Я согласен с точкой документации. Также еще один быстрый вопрос: можно ли эти атрибуты рассматривать как альтернативу «NSParameterAssert (x! = Nil)» или использовать их вместе? – iosdude
@ willcodeforf00d 'nonnull' не может использоваться вне объявления Objective-C. В качестве примера я использую функцию C. – kennytm