Не разрешается использовать константу, определенную в заголовочном файле 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"
Другие вопросы по тегам