我创建了 Objective C Header文件。并在其中添加了一些属性
我宣布了
static NSString* const kColor005C98 = @"005C98";
文件中的Constants.h
我在 Bridging-Header 文件中将此文件定义为#import "Constants.h"
现在,当我想在一些 swift 文件中使用此属性kColor005C98
时,它失败了构建,我得到了
架构armv7的未定义符号:" _kColor005C98",引自:
我不知道还需要做什么,所以我没有收到这个错误? (我已成功在其他目标C 文件中使用此属性,在这种情况下没有问题)
答案 0 :(得分: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 编译器处理,它被视为两件事 合并成一个声明:
参见例如 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
,导致
&#34;重复符号&#34;链接器错误。
另一种选择是使用宏定义:
#define kColor005C98 @"005C98"