Не разрешено использовать константу, определенную в заголовочном файле Objective C в классе swift. Undefined символы для архитектуры armv7

Я создал файл заголовка Objective C. и добавил некоторые свойства в нем.
я объявил   static NSString* const kColor005C98 = @"005C98"; в Constants.h файле

Я определил этот файл в файле Bridging-Header как #import "Constants.h" Теперь, когда я хочу использовать это свойство kColor005C98 в некотором swift файле, он завершил сборку, и я получаю

Undefined символы для архитектуры armv7: "_kColor005C98", на которые ссылаются:

Я не знаю, что еще мне нужно сделать, я не получаю эту ошибку? (я использовал это свойство в другом объективном файле C и в этом случае не проблема)

Ответ 1

Update:

Как и для 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"