Обнуляемость Objective C: квалифицирующие константы
У меня появилась довольно хорошая привычка объявлять и использовать постоянные строки для таких вещей, как NSNotification
имена. Я объявляю их так:
extern NSString * const ABCAwesomeThingHappenedNotification;
С введением Xcode 6.3 и Swift 1.2 я возвращаюсь и проверяю классы Objective-C, которые взаимодействуют с Swift, используя новый nonnull
, nullable
, а также null_unspecified
классификаторы.
При добавлении квалификаторов в заголовок, который также имеет внешне видимые статические строки, я получаю следующее предупреждение:
предупреждение: в указателе отсутствует спецификатор типа обнуляемости (__nonnull или __nullable)
Хм. Это сбивает с толку / интересно. Может кто-нибудь объяснить причину этого сообщения? Когда используешь ABCAwesomeThingHappenedNotification
в Swift никогда не предполагается, что это необязательная строка или неявно развернутая строка.
2 ответа
В вашей реализации вы можете определить:
NSString * const ABCAwesomeThingHappenedNotification = @"ABCAwesomeThingHappenedNotification";
в этом случае указатель четко nonnull
, Тем не менее, это также верно:
NSString * const ABCAwesomeThingHappenedNotification = nil;
что необходимо учитывать nullable
потому что указатель всегда нулевой указатель.
(Явная инициализация nil
является избыточным, поскольку это происходит неявно, если не указано начальное значение, но поясняет этот пример.)
Я согласен, что наличие этого спецификатора не требуется, но вот синтаксис
extern NSString * const MyConstant;
extern NSString * __nonnull const MyConstant;