Как использовать Objective-C __nonnull с обратной совместимостью?

Xcode недавно добавил атрибуты __nonnull, __nullable и т. д. Однако они не поддерживаются более старыми версиями clang и других компиляторов.

Как я могу использовать эти атрибуты совместимым образом?

Я надеялся, что что-то вроде этого сработает:

#ifndef NS_ASSUME_NONNULL_BEGIN
#define __nonnull 
#endif

но кажется, что NS_ASSUME_NONNULL_BEGIN не настоящий макрос, и он «не определен» в Xcode7.

И имело бы смысл, чтобы это работало:

#if !defined(__is_identifier) || __is_identifier(__nonnull)
#define __nonnull
#define __nullable
#endif

но Xcode 6 задыхается от этого с ошибкой «токен не является допустимым бинарным оператором в подвыражении препроцессора».


person Kornel    schedule 28.06.2015    source источник


Ответы (1)


Как объясняется в вопросе, все хорошие методы не работают. Самый тупой делает:

#if !defined(__clang_major__) || __clang_major__ < 7
#define __nonnull
#define __nullable
#endif
person Kornel    schedule 29.06.2015