我有一个用Objective-C编写的框架(让我们称之为MyKit),我用一些Swift类扩展。我尝试使用此文档来了解它: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。既然我没有桥头文件,我就会收到编译错误,因为它找不到这些对象。
文档说&#34; Swift会在你的标题栏中看到你公开展示的每个标题。&#34;当我将框架导入其他项目时,这是正确的,但框架项目无法编译,因为它没有看到它。我打开了#34;定义模块&#34;建立设置。
是否有一些我对伞头的误解?我在哪里可以说&#34;在项目中,这是伞头文件&#34;?如果我将伞头文件设置为桥接头,那么框架会编译,但这听起来像是我以这种方式回到了开头?
干杯
的Nik
答案 0 :(得分:30)
我相信您的问题可能归结为Swift课程中的Access Modifiers,但是我已经编写了一个简短的指南和示例项目来帮助您:
可以找到示例项目here
拥有混合语言框架有两个部分:
例如,如果您有一个名为Player
的Objective-C类要添加到名为Game
的快速类中。
根据文档,您需要执行以下两个步骤将Player
对象导入Game
对象。
在您的伞形头文件中,导入要向Swift公开的每个Objective-C标头。
#import <Framework/Player.h>
确保Objective-C中的Player
头文件标记为框架中的公共目标成员身份:
按照这些步骤,可以将Player
Objective-C类导入Game
Swift类:
import UIKit
public class Game: NSObject {
public let player: Player
public init(player: Player) {
self.player = player
super.init();
}
}
为了将Swift Game
类导入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
上运行的我希望这可以帮助您解决问题。
答案 1 :(得分:1)
我认为您需要使用bridging-header来访问swift中的obj-c代码。 更多链接 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html
所以它是一个文件,你从obj-c转移到swift的导入。名字非常重要所以要小心。希望它有所帮助
P.S。您还需要将此标题路径添加到项目设置
答案 2 :(得分:1)
来自Apple的文档:Swift类必须是Objective-C类的后代才能在Objective-C中访问和使用。有关可以从Objective-C访问的内容以及如何导入Swift界面的更多信息,请参阅Swift类型兼容性。
所以你的公共swift类需要扩展NSObject例如。