不允许在 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"
我创建了 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"