1

首先,我作为一名Objective C开发人员已经有很多年了,在 Swift 发布的时候,我主要是在维护现有的Obj C项目。从来没有机会完全投入到Swift应用程序上,无论是从头开始还是维护。当时我的努力主要针对 .Net 和 React Native。

我已经研究过ABI 是什么。这一切都很好,花花公子。从那个答案,我只能假设它是如何发挥作用的Swift,因为我没有太多参与Swift

因此,从简单的猜测来看,所有的骚动、喧嚣和争吵Swift ABI都与“假设”的事实有关,即当使用 Swift 5 版本(在 Swift 5 之前)编写/编译库时1.0Swift它可以与编写的应用程序一起正常工作在1.0. 当编写该库的下一个版本时Swift 2.0,上述编写的应用程序Swift 1.0将无法使用它,除非编译为Swift 2.0? 假设我在那个方面是正确的,如果我有一个用 编写的应用程序Swift 4,并且我希望使用的库是用 编写的,Swift 1.0我可以使用它吗?Swift 5现已发布,现在是否ABI解决了Swift库和应用程序的问题5+,而不是5+与之交互5-

如果我亲身经历过这些问题,我可能会对 Swift ABI 问题有更好的理解。

请用涵盖所有案例的实际示例进行解释(如果可能)。

更新:如果 ABI 有任何小版本增加的问题,例如从 swift 4.0 到 4.1,请包括

4

2 回答 2

1

关于 ABI 稳定性的主要有趣的事情是,对于 iOS 10.2 之前的系统和 5.0 之前的 Swift 语言版本,必须将 Swift 语言框架嵌入到应用程序中,这会使其大小增加几 MB,并且可能还会增加一些其他运行时开销。但是在 iOS 10.2+ 和 Swift 5.0+ 中,现在有了 ABI 稳定性,这些东西就在运行时,Swift 应用程序更小,可能更快,启动也更快。

换句话说,得益于 ABI 的稳定性,Swift 现在是 Objective C 和 Cocoa 一直以来的一等公民。

于 2019-10-22T23:40:46.910 回答
0

应用程序二进制接口。Swift 的 ABI 稳定性是关于将源代码编译成具有多个语言版本的通用接口的二进制文件。如果没有 ABI 稳定性,跨语言版本的二进制文件彼此不兼容,因为它们的格式不同。例如,动态库有一个静态调用表。正如维基百科所引用的:“ABI 定义了如何在机器代码中访问数据结构或计算例程”。ABI 稳定性确保库和调用者(应用程序)使用相同的二进制协议来调用函数,即使不是针对相同版本的语言编译。

出于 Swift 的目的,ABI 稳定性将允许开发人员切换到该语言的更新版本,而无需更新他们的库/框架,这样就可以利用该语言的新功能而无需等待库更新。来自Swift.org 2 月份的一篇文章:“今天,当一个 Swift 库发生变化时,任何使用该库的应用程序都必须重新编译。” 同样,从那篇文章中:

Apple 操作系统的 ABI 稳定性意味着部署到这些操作系统即将发布的版本的应用程序将不再需要在应用程序包中嵌入 Swift 标准库和“覆盖”库,从而缩小其下载大小;Swift 运行时和标准库将与 OS 一起提供,就像 Objective-C 运行时一样。

作为开发人员,Swift 中的 ABI 稳定性意味着与库的更多兼容性。由于 Swift 语言开发者需要确保 ABI 稳定性不被破坏,新特性的添加率将会下降。

于 2019-10-23T01:07:24.247 回答