不要使用Swift,YET编写框架/库。

仅供参考。 如果您的框架/库是开源的并且将作为源代码发布,则可以跳过此文章。

Swift是一种年轻而强大的语言,自从2014年WWDC宣布以来,发展迅速。作为iOS应用程序开发人员,我将使用Swift构建的应用程序提交给App Store后就从Objective-C切换到Swift。 但是用Swift制作框架而不是应用程序仅几个月,我遇到了一个严重的问题。

“使用Swift X编译的模块不能由Swift Y编译器导入:”

这是令我沮丧的问题。 我的框架是封闭源代码,因此我将代码编译并打包到框架中,然后移交给客户。 但是一些客户报告说由于上述错误,他们无法使用我的框架来构建他们的应用程序。 深入研究问题之后,我意识到除非应用程序的构建环境(Swift版本和Xcode版本)与Swift框架所构建的构建环境完全相同,否则无法对其进行编译。 那是因为Swift尚未在ABI上稳定。

Swift尚未在ABI上稳定。

ABI(应用程序二进制接口)

您听说过ABI吗? 坦白说,我还没遇到这个问题。 那么,什么是ABI? ABI是应用程序二进制接口。 您必须熟悉什么是API(应用程序编程接口)及其用途。 ABI是API的低级版本,它定义了两个二进制模块之间或通常在问题及其操作系统之间的接口。 与API相比,这是对ABI的很好解释。 简而言之,通过在OS中具有稳定的ABI,为较早版本的OS编写的程序仍可兼容并在较新版本的OS中运行。

但是Swift不是ABI稳定语言,这意味着Swift标准库没有嵌入OS中。 而是将它们嵌入每个应用程序中。 您可以在Xcode构建设置中看到“ Always Embed Swift Standard Libraries选项,如果在Objective-C项目中启用此选项,则应用程序的大小将增加几兆字节。 因此,通过要求在每个应用程序中嵌入Swift标准库,即使Swift不是ABI稳定的,iOS应用程序也可以避免兼容性问题。

Swift 5有望具有ABI稳定性

为什么Swift无法稳定ABI? 这是因为Swift仍然是一种过早的语言,它通过频繁的版本更新来进行许多更改和验证。 如果该语言在太早的阶段就定义了它的ABI,那么就不能以这种方式迅速地开发和改进它。 但是在今年,随着Swift 5的更新,它有望为ABI稳定做好准备。 之后,我们可以使用Swift自由编写框架,库和SDK! 好极了!

我的解决方案?

遗憾的是,我没有时间等待Swift 5🙁我可以做出3种选择。

  1. 为每个客户的构建环境构建框架
  2. 将其设为开源并按源代码进行分发
  3. 用Objective-C重新编写

我的选择是? 第3条。将Swift代码重新编写到Objective-C并不是一件繁重的工作,但是切换回旧的和缺乏安全性的语言感觉很糟糕。 实际上,我在翻译工作中没有犯错。 将为此写单独的帖子。

TL; DR

Swift正在开发尚未稳定的语言。 因此,您不应使用Swift编写框架/库,因为它可能与客户的应用程序不兼容。 等到具有ABI稳定性的Swift 5出来!