我有一个现有的 Obj-C 项目,其中包含许多共享相同 AppDelegate 的目标。我想桥接一个由选定目标使用的快速类。当我有一个目标时,我可以轻松地做到这一点。
当我向项目添加 swift 文件时,我选择所需的目标并生成必要的 bridging-header.h 文件,但是当我尝试导入这些 -swift.h 文件时,找不到它们。
对于具有多个构建目标的项目,我是否遗漏了哪些步骤?
编辑 - 更多细节
我想添加更多关于我的项目如何设置的细节。
我有一个框架,我们称之为 AppFactory,用 Obj-C 编码。我有多个构建目标,它们根据该目标的 plist 中的信息生成不同版本的核心应用程序。我想要一个供这些应用程序使用的 swift 文件。在我的构建设置中,定义模块被标记为是,我已经创建了这个 swift 类:
@objec class SwiftClass: NSObject { }
在此过程中,Xcode 生成了正确的 Bridging-Header.h 文件。
根据苹果指南 https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID130当您有多个构建目标时,您的导入标头应包含 ProductName/ProductModuleName-Swift.h,该文件应由 Xcode 自动生成。
当我查看派生数据文件夹时,ProductModuleName-Swift.h 确实存在,位于 AppFactoryCore 文件夹下的每个目标构建文件夹中。
我找到了解决问题的方法。
Swift 文件目标:我没有让 SwiftClass.swift 同时针对框架和选定的目标(AppA、AppB 和 AppC),而是退而求其次,只针对框架 AppFactoryCore。
构建设置(打包 > 定义模块):我恢复了每个应用程序目标的Defines Module
财产来自YES
to NO
,并将该属性设置为YES
为框架目标。
斯威夫特类声明:
The guide https://developer.apple.com/library/content/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-ID130状态:
由于框架目标的生成标头是框架公共接口的一部分,因此只有标有 public 或 open 修饰符的声明才会出现在框架目标的生成标头中。
所以我向我的类和类函数添加了访问控制修饰符
@objc open class SwiftClass: NSObject {
//Code
}
导入标头:
由于 SwiftClass.swift 仅针对框架目标,并且它实际上是正在使用的框架,因此将 SwiftClass.swift 标头导入到通用 AppDelegate 中是
#import <AppFactoryCore/AppFactoryCore-Swift.h>
一旦完成所有先前所述的修改,它最终变得可见。
现在该文件对于所有目标都是全局的,我添加了一个自定义属性来确定运行的目标是否应该使用 SwiftClass.swift。
希望这可以帮助其他尝试完成相对类似任务的人!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)