Подтвердить что ты не робот

Objective-C Nullability: квалификационные постоянные строки

Я получил довольно хорошую привычку объявлять и использовать постоянные строки для таких вещей, как имена NSNotification. Я объявляю их так:

extern NSString * const ABCAwesomeThingHappenedNotification;

С введением Xcode 6.3 и Swift 1.2 я возвращаюсь и проверяю классы Objective-C, которые взаимодействуют с Swift, используя новые квалификаторы nonnull, nullable и null_unspecified.

При добавлении квалификаторов в заголовок, который также имеет внешние видимые статические строки, я получаю следующее предупреждение:

предупреждение: указателю не указан спецификатор типа nullability (__nonnull или __nullable)

Хм. Это запутанное/интересное. Может кто-нибудь объяснить причины этого сообщения? При использовании ABCAwesomeThingHappenedNotification в Swift он никогда не предполагает, что это необязательная строка или неявно развернутая строка.

4b9b3361

Ответ 1

В вашей реализации вы можете определить:

NSString * const ABCAwesomeThingHappenedNotification = @"ABCAwesomeThingHappenedNotification";

в этом случае указатель явно nonnull. Однако это также справедливо:

NSString * const ABCAwesomeThingHappenedNotification = nil;

который должен считаться nullable, потому что указатель всегда является нулевым указателем.

(Явная инициализация на nil избыточна, так как это происходит неявно, если начальное значение не указано, но поясняет этот пример.)

Ответ 2

Я согласен с тем, что этот спецификатор не требуется, но вот синтаксис

extern NSString * const MyConstant;

extern NSString * __nonnull  const MyConstant;