不允许在 swift class 中使用 Objective C 头文件中定义的常量。体系结构 armv7 的未定义符号

Not allowing to use Constant defined in Objective C header file in swift class. Undefined symbols for architecture armv7

我创建了 Objective C 头文件。并在其中添加了一些属性。
我宣布
static NSString* const kColor005C98 = @"005C98";Constants.h 文件中

我在 Bridging-Header 文件中将此文件定义为 #import "Constants.h" 现在,当我想在某些 swift 文件中使用此 属性 kColor005C98 时,构建失败,我得到

Undefined symbols for architecture armv7: "_kColor005C98", referenced from:

我不知道还需要做什么才能避免出现此错误? (我已经在其他 objective C 文件中成功使用了这个 属性,在那种情况下没有问题)

更新:

从 Swift 2/Xcode 7 开始,静态常量定义如

static NSString* const kColor005C98 = @"005C98"; // in Constants.h file

导入到Swift,可以正常使用


(Swift1.x的旧答案)当代码

static NSString* const kColor005C98 = @"005C98"; // in Constants.h file

Objective-C 编译器处理,它被视为两件事 合并为一个语句:

  • 引入标识符并描述其类型的变量声明,以及
  • 一个变量定义实际上instantiates/implements这个标识符。

例子见 What is the difference between a definition and a declaration? 为了很好地解释声明和声明之间的区别 定义。

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,导致 "duplicate symbol" 链接器错误。

另一种选择是使用宏定义:

#define kColor005C98 @"005C98"