我有一个只用 Swift 编写的包,现在我想让它适用于 Objective-C 项目。我知道通常在同一个目标中使用 Swift 类可以使用为模块创建的桥接头,但是当我通过 SPM 导入我的包时,没有提示创建桥接头。这可能吗?我必须先以某些方式准备我的 swift 包裹吗?
最佳答案
令人惊讶的是,网上关于此的文档数量很少,但我终于弄明白了。这并不像在你的 package.Swift 文件中进行一些更改并单击一些按钮那么容易,但幸运的是它也不是太难。我仍在努力使我的 Swift 库完全可以在 Objc 中使用,并将根据我在此过程中发现的任何发现来更新这个答案,但这是我目前所拥有的:
public final class MyObjcLibrary: NSObject {}
@objc
关键字,并且您可以在关键字后面用括号指定 objc 代码使用的类名 - 当您的 objc 类只是一个包含相应 Swift 类的一堆导出函数的包装器时,这非常方便:@objc(MyLibrary)
public final class MyObjcLibrary: NSObject{}
这样,您的图书馆的用户可以写[MyLibrary alloc]
而不是 [MyObjcLibrary alloc]
.@objc
关键字)。假设你有一个名为 MyLibrary
的 Swift 类: @objc(MyLibrary)
public final class MyObjcLibrary: NSObject{
private var myLibrary: MyLibrary
@objc public init() {
myLibrary = MyLibrary()
}
@objc public static func doSomething(withID: String) {
myLibrary.doSomething(withID)
}
@objc public static func doSomethingElse(ID: String) {
myLibrary.doSomethingElse(ID)
}
...
}
@import MyPackage
...
[[MyLibrary alloc] init];
[MyLibrary doSomethingWithID:@"my_id"];
[MyLibrary doSomethingElseWithID:@"my_id"];
...
注意函数是如何在 objc 中命名的——如果第一个参数不以前缀“with”开头,它会自动添加到 objc 函数签名中,例如doSomethingElseWithID
.我见过的问题:
关于ios - 如何使 Swift 包在 Objective-C 项目中可导入/可用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66910913/