【问题标题】:Accessing Objective-C #define constant from Swift从 Swift 访问 Objective-C #define 常量
【发布时间】: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 = @"某个字符串"

这两种方法都没有奏效。

【问题讨论】:

  • 那只是一个打字错误。现已更正。
  • 您是否将这些头文件添加到您的桥接头中?
  • 是的,我用 swift 文件将它添加到框架的桥接头文件中,但仍然说使用了未解析的标识符。

标签: objective-c swift preprocessor bridging


【解决方案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'
猜你喜欢
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 2016-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
  • 2016-10-15
相关资源
最近更新 更多