如何为Objective-C和Swift创build一个通用的iOS库?
我需要为Objective-C和Swift项目中的iOS(Framework或静态库 – 我还没有决定)创build一个库。 这样做的最好方法是什么? 我看到的方式有三种select:
- 在Objective-C中编写库并添加对Swift的支持(桥接头等)。
- 在Swift中编写库并添加对Objective-C的支持。
- 在Objective-C和Swift中编写两个库。 我真的想要避免这个选项。
这里的主要要求是开发人员尽可能地使用它。 理想情况下,他们应该能够select他们的语言,而不关心甚至不知道图书馆本身是用什么语言写成的。这可以做到吗?
另外,我希望能够用CocoaPods分发这个库,如果这有什么意义的话。
备选scheme2.没有问题(稍后详细介绍)
选项3.如你所说,你应该真的避免它。
选项1是最好的。 只要用Obj-C和Swift来devise你的API。 这是什么意思 ?
•不要使用select器 – 它们不是Swift标准。
• 使用可空性转换为可选项
•闭包和块可能具有相同的语法,但有一点区别,请注意:
Swift闭包和Objective-C块是兼容的,所以你可以将Swift闭包传递给期望块的Objective-C方法。 Swift的闭包和函数具有相同的types,所以你甚至可以传递一个Swift函数的名字。
闭包具有与块类似的捕获语义,但在一个关键方面有所不同:variables是可变的而不是复制的。 换句话说,Objective-C中__block的行为是Swiftvariables的默认行为。
资料来源:苹果公司在Cocoa和Objective-C中使用Swift – 它详细解释了一切。
你可以在这里阅读更多 。
当devise这样的API时,你必须知道如何转换所有的东西,但是如果你做的正确,用户不会注意到区别:)
模块文件
确保你的x.framework
与modules
文件夹和里面的文件一起提供。
新的Xcode为你生成它。 这样,用户就可以在Swift中使用Obj-C项目,而无需将其添加到桥接文件中。 所以他们可以从盒子里import myLib
。
为什么不迅速?
不幸的是,现在分配已编译库的最明智的方法是将其写入Objective-C中。
这是因为一个很大的原因: 迅速的二进制兼容性问题
尽pipe您的应用程序的运行时兼容性得到了保证,但Swift语言本身将继续发展,二进制接口也将发生变化。 为了安全起见,应用程序的所有组件都应该使用相同版本的Xcode和Swift编译器来构build,以确保它们一起工作。
这意味着框架需要仔细pipe理。 例如,如果您的项目使用框架与embedded式扩展共享代码,则需要一起构build框架,应用程序和扩展。 依赖使用Swift的二进制框架(尤其是来自第三方)是危险的。 随着Swift的变化,这些框架将与您的应用程序的其余部分不兼容。 当二进制接口在一两年内稳定后,Swift运行时将成为主机操作系统的一部分,这个限制将不再存在。
PSPDFKit的创始人彼得·斯坦伯格(Peter Steinberger)也是一个以编译库的forms发布的库,遇到了同样的问题:现在他们被Obj-C卡住了,不能使用Swift 。