Swift 近兩年的發展勢頭非常的迅猛,而在它開源後,更是如井噴一樣的勢頭,除了 iOS 平台,還支持了 Linux。 而今年下半年, Swift 3.0 也會隨之發布。這次我就和大家聊一下 Swift 3.0 會有什麼新東西吧。
Swift 專門為版本更新相關的文檔創建了一個 Guihub 主頁,地址是 https://github.com/apple/swift-evolution 。
這裡面列出了 Swift 3.0 版本著重處理的地方,我來幫大家總結一下:
更穩定的 ABI
所謂 ABI 就是二進制接口, 是更加底層的機制。 我們都熟知 API,是應用程序接口,比如
fun open(path: String)
, 這時一個函數簽名,只要我們的程序在編譯的時候能找到這個方法簽名的實現就可以編譯通過。這樣,我們想改變這個方法的具體實現的時候,並不需要修改我們調用層的代碼,只需要將這個方法的實現替換成另外一個庫就可以了。
而 ABI 就更加底層了,它是基於語言和系統層面的。如果 Swift 3 對 ABI 的優化做的足夠好的話,我們就可以之間在之後的版本中引用老版本 Swift 語言編譯的庫了。就不用怕 Swift 語言升級之後,很多第三方庫都需要修改的問題了。
相信有從 Swift 1.x 遷移到 Swift 2 體驗的同學們對這個感觸會更深~ 當然,這是 Swift 3 的一個目標,能不能實現就要看社區的力量了。
解決易碎接口問題
所謂
易碎接口嘛,是現代程序語言的一個通用問題,它的全稱叫做
Fragile Binary Interface
。 簡單來說呢,就是 Swift 以及當前的大多數主流開發語言中的類的屬性,在底層都是通過偏移來訪問的,比如
book.name
, 我們在程序中訪問一個對象的屬性非常直觀。 但他在編譯後,實際上是這樣的形式
location(book) + offset(name)
。訪問 name 屬性是通過 book 對象所在的內存地址加上一個偏移來實現的。
那麼 Swift 中的類在編譯後,會將它所有的屬性的偏移值也都計算出來。這樣會加快程序在運行時的執行速度,因為不需要在運行時再計算這些偏移量了。如果所有的類之間沒有任何關聯就不會有什麼問題,但在實際中,我們使用類都會有繼承關系。假如我們的主項目中引用了一個外部的庫,我們主程序中繼承了這個外部庫中的類。那麼如果這個庫中有任何改動,我們都必須重新編譯所有的類繼承樹上面的代碼,否則在我們主程序的子類中,就會發生偏移計算錯誤。
簡單來說呢,如果 Swift 3.0 能把
Fragile Binary Interface
處理好的話,對我們開發者最直觀的感受就是:
編譯速度加快。
關於
Fragile Binary Interface
更詳細的內容,大家如果有興趣的話可以參考這裡:https://en.wikipedia.org/wiki/Fragile_binary_interface_problem
可移植性
這個很簡單,就是讓 Swift 能移植到更多的其他平台,並且讓 Swift 寫出的代碼,可以正確的運行在所有這些平台上。
全面支持泛型
目前的 Swift 版本已經很好的支持了泛型的大部分特性了,這點大家在看 Swift 2.2 的 API 文檔中其實已經能夠發現了。但目前還並沒有將泛型的特性完全實現,所以這次 Swift 3.0 打算全面支持泛型的所有特性。
發布 API 設計規范
這次還發布了 Swift 語言的 API 設計規范。 這個規范的目的是讓大家設計出更加統一的 API,裡面給出了很多代碼規范,這個非常值得一看,即便我們不去構建開源庫,對我們的日常代碼風格也是很有幫助的。並且 Swift 3.0 會對大多數 API 根據這個規范進行重新設計。理解了這個設計規范,對我們理解 Swift 語言也是很有幫助的~
設計規范地址:https://swift.org/documentation/api-design-guidelines
總結
Swift 是一個快速發展的語言,開源社區源源不斷的給它注入力量。從這次 3.0 的發布內容來看,它正在嘗試解決編程語言最前沿的問題,比如
Fragile Binary Interface
, 大家有興趣可以關於它的相關資料,這裡就不再贅述。