从 Swift 访问 Objective-C #define 常量
Posted
技术标签:
【中文标题】从 Swift 访问 Objective-C #define 常量【英文标题】:Accessing Objective-C #define constant from Swift 【发布时间】:2019-11-21 23:46:28 【问题描述】:我有一个包含 Swift 和 Objective C .h 和 .m 文件的现有项目。在其中一个 .h 文件中有很多
#define kSomeConstant @"某个字符串"
当 Swift 文件位于作为应用程序子项目的框架中时,如何使这些文件可用于项目中的 Swift 文件?
到目前为止,我已经尝试在 .m 文件类定义中创建包装静态方法,例如:
+ (NSString*) objc_kSomeConstant return kSomeConstant;
我尝试在 .h 中执行以下操作:
extern NSString *const kSomeConstant;
使用 .m 文件中的定义:
NSString *const kSomeConstant = @"某个字符串"
这两种方法都没有奏效。
【问题讨论】:
=
语法中没有 =
。 techonthenet.com/c_language/constants/create_define.php
那只是一个打字错误。现已更正。
您是否将这些头文件添加到您的桥接头中?
是的,我用 swift 文件将它添加到框架的桥接头文件中,但仍然说使用了未解析的标识符。
【参考方案1】:
需要明确的是,您在项目的主应用程序目标的 Objective-C 头文件中有一些定义,并且您希望将它们提供给作为主项目子项目的框架目标中的 Swift 文件.通常,您的应用程序取决于框架中的定义,而不是相反。要在应用程序和框架之间共享这些定义,请创建一个可供两者使用的 clang 编译器模块。
为此,将带有定义的标题移动到一个文件夹(我们将其称为“Common”),并在该文件夹中创建一个名为“module.modulemap”的文件,其中包含以下内容:
module Common
header "CommonDefinitions.h"
接下来,在您的框架目标中,将 Import Paths 设置(在 Swift Compiler - Search Paths 下)设置为该文件夹的路径(例如 em>,$(SRCROOT)/Common
)。您可能还需要将此文件夹添加到主应用程序的 Header Search Paths 设置中,以便继续成功编译。
现在,只需添加语句import Common
,即可从框架中的 Swift 文件访问定义。 (请注意,名称 #define
d 作为 Objective-C 字符串文字,如您的示例中的 kSomeConstant
,作为 String
常量导入到 Swift 中;不需要将它们重写为 extern NSString *
声明。)
【讨论】:
$(SRCROOT)/Common 和其中的 .h 是相对于包含项目的。有没有办法从子项目中获取到最顶层 .xcodeproj 的路径? 头文件还有其他导入,并定义了目标C类的接口,因此有一个对应的.m文件。 我只将#defines 移出到Common 模块中的单独标题中。但是现在无法构建 Objective-C 模块'Common'以上是关于从 Swift 访问 Objective-C #define 常量的主要内容,如果未能解决你的问题,请参考以下文章
项目在 Swift 中时无法从 Objective-C 访问 swift 类
如何从同一个故事板访问 Objective-C 和 Swift 类?
如何从 Swift 扩展访问 Objective-C 类的私有成员?
从 Swift 访问 Objective-C #define 常量