将 Swift 类添加到具有多个目标的 Objective-C 项目

Posted

技术标签:

【中文标题】将 Swift 类添加到具有多个目标的 Objective-C 项目【英文标题】:Adding Swift Class to Objective-C Project with Multiple Targets 【发布时间】:2017-04-25 01:11:44 【问题描述】:

我有一个现有的 Obj-C 项目,其中包含许多共享同一个 AppDelegate 的目标。我想桥接选择目标使用的 swift 类。当我有一个目标时,我可以很容易地做到这一点。

当我将 swift 文件添加到项目中时,我选择了所需的目标并生成了必要的 bridging-header.h 文件,但是当我尝试导入那些 -swift.h 文件时,找不到它们.

对于具有多个构建目标的项目,我是否缺少一些步骤?

编辑 - 更多详情

我想补充一点关于我的项目是如何设置的详细信息。

我有一个框架,我们称之为 AppFactory,用 Obj-C 编码。我有多个构建目标,它们根据目标 plist 中的信息生成不同版本的核心应用程序。我希望这些应用程序可以使用 swift 文件。在我的构建设置中,Defines Module 被标记为 Yes,我已经创建了这个 swift 类:

@objec class SwiftClass: NSObject  

在此过程中,Xcode 生成了正确的 Briding-Header.h 文件。

根据Apple Guides,当您有多个构建目标时,您的导入标头应该包含 ProductName/ProductModuleName-Swift.h,它应该由 Xcode 自动生成。

当我查看派生数据文件夹时,ProductModuleName-Swift.h 确实存在,在每个目标构建文件夹中,在 AppFactoryCore 文件夹下。

【问题讨论】:

【参考方案1】:

我找到了解决问题的方法。

Swift 文件目标: 我没有让 SwiftClass.swift 同时针对框架和选定的目标(AppA、AppB 和 AppC),而是退回并仅针对框架 AppFactoryCore。

构建设置(打包 > 定义模块): 我将每个应用目标的Defines Module 属性从YES 还原为NO,并将框架目标的此属性设置为YES

Swift 类声明: guide 声明:

因为为框架目标生成的标头是框架公共接口的一部分,所以只有标有 public 或 open 修饰符的声明才会出现在为框架目标生成的标头中。

所以我在我的类和类函数中添加了访问控制修饰符

@objc open class SwiftClass: NSObject 
    //Code

导入页眉: 由于 SwiftClass.swift 只针对 framework 目标,而且它实际上是一个正在使用的框架,所以在通用 AppDelegate 中 import SwiftClass.swift 的 header 是

#import <AppFactoryCore/AppFactoryCore-Swift.h>

在完成所有先前声明的修改后,它最终变得可见。

现在该文件对所有目标都是全局的,我添加了一个自定义属性来识别正在运行的目标是否是应该使用 SwiftClass.swift 的目标。

希望这可以帮助其他尝试完成相对相似任务的人!

【讨论】:

以上是关于将 Swift 类添加到具有多个目标的 Objective-C 项目的主要内容,如果未能解决你的问题,请参考以下文章

将渐变层添加到具有相同名称 Xcode/Swift 的所有按钮

module.map 用于从测试目标访问主目标中的(Swift 和 Objective-C)类

在 SDK 中支持 Swift,部署目标为 7.0

将多个声音(目标 c)播放到 Swift(xcode 7)的代码帮助

将目标c代码添加到swift文件[关闭]

如何使用通知将字符串数据从 swift 传递到目标 c 类