我有一个用 Objective-C 编写的框架(我们称之为 MyKit),我用一些 Swift 类对其进行了扩展。我正在尝试使用以下文档来理解它:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_77 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_77
据我了解,我不应该有桥接头类,而是将所有包含内容放在伞头文件中(我理解是)。
所以我在MyKit.h中写道:
#import <MyKit/ModelObjectA.h>
#import <MyKit/ModelObjectB.h>
#import <MyKit/ControllerObjectC.h>
我没有列出 ControllerObjectD.swift,即使它也进入这里?或者我应该包括
#import <MyKit/ControllerObjectD-Swift.h>
?
ControllerObjectD 使用 ModelObjectA 和 ModelObjectB。现在我没有桥头文件,我会收到编译错误,因为它找不到这些对象。
该文档称“Swift 将看到您在伞标头中公开公开的每个标头。”当我将框架导入其他项目时,情况确实如此,但框架项目无法编译,因为它看不到它。我已打开“定义模块”构建设置。
也许我对伞头有什么误解?我在哪里可以说“嗨项目,这是伞头文件”?如果我将伞头文件设置为桥接头文件,框架就会编译,但这听起来像是我以这种方式回到了起点?
Cheers
Nik
我相信您的问题可能在于 Swift 类中的访问修饰符,但是我编写了一个简短的指南和示例项目来帮助您:
可以找到示例项目here https://github.com/elliott-minns/SwiftObjCTestFramework
混合语言框架分为两个部分:
- 将 Objective-C 导入 Swift
- 将 Swift 导入 Objective-C
1. 将 Objective-C 导入 Swift
例如,如果您有一个名为的 Objective-C 类Player
您想要添加到一个名为的 swift 类中Game
.
根据文档,您需要执行以下两个步骤来导入Player
对象进入Game
object.
- 在“构建设置”下的“打包”中,确保该框架目标的“定义模块”设置设置为“是”。
-
在您的头文件中,导入您想要向 Swift 公开的每个 Objective-C 头文件。
#import <Framework/Player.h>
确保您的Player
Objective-C 中的头文件被标记为框架中的公共目标成员身份:
按照以下步骤,可以导入Player
Objective-C类进Game
斯威夫特类:
import UIKit
public class Game: NSObject {
public let player: Player
public init(player: Player) {
self.player = player
super.init();
}
}
2. 将 Swift 导入 Objective-C
用于导入 SwiftGame
类进入Player
对象,我们可以遵循类似的过程。
- 像之前一样;在“构建设置”下的“打包”中,确保该框架目标的“定义模块”设置设置为“是”。
-
使用以下语法并替换适当的名称,将 Swift 代码从该框架目标导入到该框架目标内的任何 Objective-C .m 文件中:
#import <ProductName/ProductModuleName-Swift.h>
就我而言,其工作原理如下:
#import <SwiftObjC/SwiftObjC-Swift.h>
我假设,对你来说:
#import <MyKit/MyKit-Swift.h>
因此,请确保您要访问的所有属性、方法和类在您的 swift 文件中定义为 public,否则它们对 Objective-C 不可见。
我已经在 GitHub 上上传了示例项目,展示了这一切是如何工作的https://github.com/elliott-minns/SwiftObjCTestFramework https://github.com/elliott-minns/SwiftObjCTestFramework
我希望这可以帮助您解决您的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)