2016-08-09 Tuesday

从Swift 3开始,可以认为Swift源代码级别兼容是没有问题的了,即Swift 4的编译器可以直接正确编译Swift 3的代码,而不需要像Swift 2到3或者Swift 1到2那样必须进行代码迁移。

原始信息在这:Swift Evolution,特别注意下面这段话

The primary goal of this release is to solidify and mature the Swift language and development experience. While source breaking changes to the language have been the norm for Swift 1 through 3, we would like the Swift 3.x (and Swift 4+) languages to be as source compatible with Swift 3.0 as reasonably possible. However, this will still be best-effort: if there is a really good reason to make a breaking change beyond Swift 3, we will consider it and find the least invasive way to roll out that change (e.g. by having a long deprecation cycle).

这段话的最重要的信息是,尽管Swift 1到3,经常出现源代码不兼容的情况,Swift社区还是决定从Swift 3.x开始,尽可能保证之版本的Swift与Swift 3是源代码级别兼容的。然而,如果Swift社区觉得非常有必要的话,也还是会做出一些语言上的重大变化,只不过这一次社区将尽可能的用温和的方式。所以,大家从Swift 3开始,不需要过于担心升级Xcode以后大量代码编译不通过的问题了。

然而,Swift 3到4的二进制兼容是没有保证的,所以,Swift 3编译出来的的framework,那是不可以用到Swift 4的工程中的。

详情见Rewrite the Swift 3 “goals” and drop the “nongoals” section, now that it的内容,大家可以看到

* **Stable ABI**

部分被删除了,也就是说Swift 3和以后版本的Swift的二进制兼容是大概率不可能的了,你用Swift 3编译的静态库和动态库,那是不能用到Swift 4工程上的。

如果你要对外发布framework,那么,暂时不要用Swift编写framework。

如果你的代码以开源的方式对外发布,并且他人的集成方式也是源代码集成的话,你大可以可以安心了,不需担心要像之前那样,swift1一个分支,swift2一个分支,swift3一个分支,并且三个分支互不兼容。Swift 4的工程也可以使用Swift 3的代码,正如你可以在C++源文件中写C代码,在Objective-C++的mm文件中写C++代码。