不允许在swift类中使用Objective C头文件中定义的Constant.架构armv7的未定义符号

Was*_*han 14 objective-c arm7 swift

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

static NSString* const kColor005C98 = @"005C98";Constants.h档案中 宣布

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

架构armv7的未定义符号:"_kColor005C98",引自:

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

Mar*_*n R 20

更新:

从Swift 2/Xcode 7及更高版本开始,就像静态常量定义一样

static NSString* const kColor005C98 = @"005C98"; // in Constants.h file
Run Code Online (Sandbox Code Playgroud)

导入到Swift,可以毫无问题地使用.


(Swift 1.x的旧答案)当代码

static NSString* const kColor005C98 = @"005C98"; // in Constants.h file
Run Code Online (Sandbox Code Playgroud)

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

  • 一个变量声明,它引入一个标识符并描述它的类型,和
  • 实际实例化/实现此标识符的变量定义.

例如,参见 定义和声明之间的区别是什么? 为了解释声明和定义之间的区别.

Swift编译器仅将语句视为声明.因此,变量未在任何地方定义,从而导致链接器错误.

要解决此问题,您必须将定义移动到Objective-C文件:

// Constants.m:
#import "Constants.h"
NSString * const kColor005C98  = @"005C98";
Run Code Online (Sandbox Code Playgroud)

并更改声明一个extern声明:

// Constants.h:
extern NSString * const kColor005C98;
Run Code Online (Sandbox Code Playgroud)

或者,您可以删除static修饰符:

 NSString * const kColor005C98 = @"005C98";
Run Code Online (Sandbox Code Playgroud)

使其适用于Swift.缺点是当多行Objective-C文件包含此行时,它们都将定义全局可见符号kColor005C98,从而导致"重复符号"链接器错误.

另一种方法是使用宏定义:

#define kColor005C98 @"005C98"
Run Code Online (Sandbox Code Playgroud)