从 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 文件访问定义。 (请注意,名称 #defined 作为 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 常量

无法从 Objective-C 视图控制器访问 Swift var - iOS

如何从 Swift 单元测试访问测试目标中存在的 Objective-C 代码?