将 Swift Class 添加到 Objective-C 具有多个目标的项目
Adding Swift Class to Objective-C Project with Multiple Targets
我有一个现有的 Obj-C 项目,其中包含许多共享同一个 AppDelegate 的目标。我想桥接一个 swift class 被 select 目标使用。当我有一个目标时,我可以很容易地做到这一点。
当我将 swift 文件添加到项目时,我 select 生成了所需的目标和必要的 bridging-header.h 文件,但是当我尝试导入这些文件时 - swift.h 个文件,找不到它们。
对于具有多个构建目标的项目,我是否遗漏了哪些步骤?
编辑 - 更多详细信息
我想添加更多有关项目设置方式的详细信息。
我有一个框架,我们称之为 AppFactory,编码为 Obj-C。我有多个构建目标,它们根据该目标的 plist 中的信息生成不同版本的核心应用程序。我想要一个 swift 文件供这些应用程序使用。在我的构建设置中,定义模块被标记为是,我创建了这个 swift class:
@objec class SwiftClass: NSObject { }
在这样做的过程中,Xcode 生成了正确的 Briding-Header.h 文件。
根据 Apple Guides 当你有多个构建目标时你的导入 header 应该包括 ProductName/ProductModuleName-Swift.h,它应该由 Xcode.
当我查看派生数据文件夹时,ProductModuleName-Swift.h 确实存在,在 AppFactoryCore 文件夹下的每个目标构建文件夹中。
我找到了解决问题的方法。
Swift 文件目标:
我没有 SwiftClass.swift 同时针对框架和选定的目标(AppA、AppB 和 AppC),而是后退并只针对框架 AppFactoryCore。
构建设置(打包 > 定义模块):
我将每个应用程序目标的 Defines Module
属性 从 YES
还原为 NO
,并将框架目标的 属性 设置为 YES
。
Swift Class声明:
guide 状态:
Because the generated header for a framework target is part of the framework’s public interface, only declarations marked with the public or open modifier appear in the generated header for a framework target.
所以我在 class 和 class 函数中添加了访问控制修饰符
@objc open class SwiftClass: NSObject {
//Code
}
导入Header:
由于 SwiftClass.swift 仅针对框架目标,而且它实际上是一个正在使用的框架,因此 header 将 SwiftClass.swift 导入通用 AppDelegate 是
#import <AppFactoryCore/AppFactoryCore-Swift.h>
完成所有先前声明的修改后,它终于变得可见了。
既然文件对所有目标都是全局的,我添加了一个自定义属性来确定目标 运行 是否应该使用 SwiftClass.swift.
希望这可以帮助其他人尝试完成相对相似的任务!
我有一个现有的 Obj-C 项目,其中包含许多共享同一个 AppDelegate 的目标。我想桥接一个 swift class 被 select 目标使用。当我有一个目标时,我可以很容易地做到这一点。
当我将 swift 文件添加到项目时,我 select 生成了所需的目标和必要的 bridging-header.h 文件,但是当我尝试导入这些文件时 - swift.h 个文件,找不到它们。
对于具有多个构建目标的项目,我是否遗漏了哪些步骤?
编辑 - 更多详细信息
我想添加更多有关项目设置方式的详细信息。
我有一个框架,我们称之为 AppFactory,编码为 Obj-C。我有多个构建目标,它们根据该目标的 plist 中的信息生成不同版本的核心应用程序。我想要一个 swift 文件供这些应用程序使用。在我的构建设置中,定义模块被标记为是,我创建了这个 swift class:
@objec class SwiftClass: NSObject { }
在这样做的过程中,Xcode 生成了正确的 Briding-Header.h 文件。
根据 Apple Guides 当你有多个构建目标时你的导入 header 应该包括 ProductName/ProductModuleName-Swift.h,它应该由 Xcode.
当我查看派生数据文件夹时,ProductModuleName-Swift.h 确实存在,在 AppFactoryCore 文件夹下的每个目标构建文件夹中。
我找到了解决问题的方法。
Swift 文件目标: 我没有 SwiftClass.swift 同时针对框架和选定的目标(AppA、AppB 和 AppC),而是后退并只针对框架 AppFactoryCore。
构建设置(打包 > 定义模块):
我将每个应用程序目标的 Defines Module
属性 从 YES
还原为 NO
,并将框架目标的 属性 设置为 YES
。
Swift Class声明: guide 状态:
Because the generated header for a framework target is part of the framework’s public interface, only declarations marked with the public or open modifier appear in the generated header for a framework target.
所以我在 class 和 class 函数中添加了访问控制修饰符
@objc open class SwiftClass: NSObject {
//Code
}
导入Header: 由于 SwiftClass.swift 仅针对框架目标,而且它实际上是一个正在使用的框架,因此 header 将 SwiftClass.swift 导入通用 AppDelegate 是
#import <AppFactoryCore/AppFactoryCore-Swift.h>
完成所有先前声明的修改后,它终于变得可见了。
既然文件对所有目标都是全局的,我添加了一个自定义属性来确定目标 运行 是否应该使用 SwiftClass.swift.
希望这可以帮助其他人尝试完成相对相似的任务!