Не разрешается использовать константу, определенную в заголовочном файле Objective C в классе swift. Неопределенные символы для архитектуры armv7
Я создал файл заголовка Objective C. и добавил некоторые свойства в нем.
я объявил static NSString* const kColor005C98 = @"005C98";
в Constants.h
файл
Я определил этот файл в файле заголовка как #import "Constants.h"
Теперь, когда я хочу использовать это свойство kColor005C98
в каком-то быстром файле не удалось построить, и я получаю
Неопределенные символы для архитектуры armv7: "_kColor005C98", на которую ссылаются из:
я не знаю, что еще мне нужно сделать, чтобы я не получил эту ошибку? (Я успешно использовал это свойство в другом целевом файле C, и в этом случае проблем не было)
1 ответ
Обновить:
Начиная с Swift 2/Xcode 7 и более поздних версий, определение статической константы, например
static NSString* const kColor005C98 = @"005C98"; // in Constants.h file
импортируется в Swift и может быть использован без проблем.
(Старый ответ для Swift 1.x) Когда код
static NSString* const kColor005C98 = @"005C98"; // in Constants.h file
обрабатывается компилятором Objective-C, он обрабатывается как две вещи, объединенные в один оператор:
- Объявление переменной, которая вводит идентификатор и описывает его тип, и
- определение переменной, которая фактически создает / реализует этот идентификатор.
Посмотрите, например, в чем разница между определением и объявлением? для хорошего объяснения разницы между декларацией и определением.
Компилятор Swift обрабатывает оператор только как объявление. Поэтому переменная нигде не определена, что вызывает ошибку компоновщика.
Чтобы решить эту проблему, вы должны переместить определение в файл Objective-C:
// Constants.m:
#import "Constants.h"
NSString * const kColor005C98 = @"005C98";
и измените объявление на extern
объявление:
// Constants.h:
extern NSString * const kColor005C98;
Кроме того, вы можете просто удалить static
модификатор:
NSString * const kColor005C98 = @"005C98";
заставить его работать со Swift. Недостатком является то, что когда эта строка включена в несколько файлов Objective-C, все они будут определять глобально видимый символ kColor005C98
, вызывая ошибки компоновщика "дубликат символа".
Другая альтернатива - использовать вместо этого определение макроса:
#define kColor005C98 @"005C98"