Ответ 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"