Ожидается NS_DESIGNATED_INITIALIZER: (двоеточие)
Я пытаюсь объявить назначенный инициализатор следующим образом:
- (instancetype)initWithDelegate:(id <MyDelegate>)delegate NS_DESIGNATED_INITIALIZER;
Но он показывает мне эту ошибку компиляции:
Expected ':'
Интересно, когда я пытаюсь написать его вот так (ссылка: Принятие современного Objective-C) -
- (instancetype)init NS_DESIGNATED_INITIALIZER;
Он показывает эту ошибку:
Expected ';' after method prototype.
Любые идеи о том, как правильно использовать NS_DESIGNATED_INITIALIZER?
Ответы
Ответ 1
NS_DESIGNATED_INITIALIZER
макрос не определен в заголовках библиотеки для Xcode 5 - вам нужен Xcode 6 для его использования. Обратите внимание, что ваша ссылка говорит "Предварительная версия".
Макрос определяется следующим образом (цитирование NSObjCRuntime.h
)
#ifndef NS_DESIGNATED_INITIALIZER
#if __has_attribute(objc_designated_initializer)
#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
#else
#define NS_DESIGNATED_INITIALIZER
#endif
#endif
Заметьте, что вы все равно можете использовать
- (instancetype)initWithDelegate:(id <MyDelegate>)delegate __attribute__((objc_designated_initializer));
в Xcode 5 или вы можете добавить этот макрос явно в свой предварительно скомпилированный заголовок.
Ответ 2
Помните, что вы можете добавлять это только к объявлениям расширений интерфейса или класса, иначе вы получите эту ошибку:
'objc_designated_initializer' attribute only applies to init methods of interface or class extension declarations