Обнуляемость 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;
Другие вопросы по тегам