gpt4 book ai didi

objective-c - 不允许在 swift 类中使用 Objective C 头文件中定义的 Constant。体系结构 armv7 的 undefined symbol

转载 作者:行者123 更新时间:2023-11-28 09:12:40 31 4
gpt4 key购买 nike

我创建了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 中,可以毫无问题地使用。


(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,导致“重复符号”链接器错误。

另一种选择是改用宏定义:

#define kColor005C98 @"005C98"

关于objective-c - 不允许在 swift 类中使用 Objective C 头文件中定义的 Constant。体系结构 armv7 的 undefined symbol ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28711585/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com