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 он никогда не предполагает, что это необязательная строка или неявно развернутая строка.
Ответы
Ответ 1
В вашей реализации вы можете определить:
NSString * const ABCAwesomeThingHappenedNotification = @"ABCAwesomeThingHappenedNotification";
в этом случае указатель явно nonnull
. Однако это также справедливо:
NSString * const ABCAwesomeThingHappenedNotification = nil;
который должен считаться nullable
, потому что указатель всегда является нулевым указателем.
(Явная инициализация на nil
избыточна, так как это происходит неявно, если начальное значение не указано, но поясняет этот пример.)
Ответ 2
Я согласен с тем, что этот спецификатор не требуется, но вот синтаксис
extern NSString * const MyConstant;
extern NSString * __nonnull const MyConstant;