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

时间:2015-02-18 06:12:23

标签: objective-c swift arm7

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

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

  

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

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

1 个答案:

答案 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 编译器处理,它被视为两件事 合并成一个声明:

  • 变量声明,它引入标识符并描述其类型,
  • 一个变量 definition ,它实际上实例化/实现了这个标识符。

参见例如 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"