16

我创建了Objective C 头文件。并在其中添加了一些属性。

static NSString* const kColor005C98 = @"005C98";Constants.h文件 中声明

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

架构 armv7 的未定义符号:“_kColor005C98”,引用自:

我不知道我还需要做什么,所以我没有收到这个错误?(我已在其他目标 C文件中成功使用此属性,在这种情况下没有问题)

4

1 回答 1

20

更新:

从 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"
于 2015-02-18T08:09:03.777 回答