2016-05-12 7 views
3

Означает ли компилятор Objective-C, если он считает, что вы можете передать nil параметру, отмеченному _Nonnull?_Nullable и _Nonnull полезны для чего угодно, кроме Swift interop?

Или это всего лишь намек на то, какой инструмент преобразует Swift и Objective-C, чтобы лучше справляться с опциями Swift?

ответ

2

Само по себе есть предупреждение только в чрезвычайно тривиальном случае: когда вы передаете 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) 
} 

The code above when compiled in Xcode 7

(Существует -Wnullable-to-nonnull-conversion flag но это, кажется, не оказывает никакого влияния на код выше.)

As documented, три атрибута не изменит поведение кода :

... Обратите внимание, что, в отличие от атрибута декларации nonnull, наличие _Nonnullне означает, что передача null - это неопределенное поведение.: fetch может свободно рассматривать неопределенное поведение или (возможно, по соображениям обратной совместимости) защитный дескриптор.

Помимо компилятора, это также поможет статический анализатор, но снова лязг статику анализатор только поймать тривиальный случай, когда он знает, что вы присваиваете nil к _Nonnull (т.е. test(f) пример выше).

Тем не менее, он по-прежнему полезно отметить указатель _Nonnull/_Nullable, как

  1. документации;
  2. Позвольте разработчикам Swift лучше использовать вашу библиотеку;
  3. компилятор будет выдавать предупреждения везде, если не добавить эти аннотации
+0

Если один использовать '' _Nonnull'/_Nullable' вместо ''/nonnull' nullable'? Кажется, вы предпочитаете вариант подчеркивания, не могли бы вы объяснить, почему? Я лично считаю, что «nonnull» и «nullable» легче читать, и следующая статья в Swift-блоге, по-видимому, предлагает последнее по сравнению с предыдущим как более приятную альтернативу: https://developer.apple.com/swift/blog/?id = 25 – iosdude

+0

Я согласен с точкой документации. Также еще один быстрый вопрос: можно ли эти атрибуты рассматривать как альтернативу «NSParameterAssert (x! = Nil)» или использовать их вместе? – iosdude

+0

@ willcodeforf00d 'nonnull' не может использоваться вне объявления Objective-C. В качестве примера я использую функцию C. – kennytm