如何为Objective-C和Swift创build一个通用的iOS库?

我需要为Objective-C和Swift项目中的iOS(Framework或静态库 – 我还没有决定)创build一个库。 这样做的最好方法是什么? 我看到的方式有三种select:

  1. 在Objective-C中编写库并添加对Swift的支持(桥接头等)。
  2. 在Swift中编写库并添加对Objective-C的支持。
  3. 在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.frameworkmodules文件夹和里面的文件一起提供。

新的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 。