三疊紀公園:Swift 的進化史

做者:Natasha The Robot,原文連接,原文日期:2016-04-15
譯者:Cee;校對:Channe;定稿:千葉知風git

最新被接受的

SE-0048泛型別名在定義中引進了類型的參數,例如:程序員

typealias StringDictionary<T> = Dictionary<String, T>
typealias DictionaryOfStrings<T : Hashable> = Dictionary<T, String>
typealias IntFunction<T> = (T) -> Int
typealias Vec3<T> = (T, T, T)
typealias BackwardTriple<T1,T2,T3> = (T3, T2, T1)

爲類型從新聲明別名時有一些限制條件。例如在存放字符串的詞典中,主鍵必須實現 hashable 協議纔可以使用。Swift 的編譯器會在不知足限制條件時提供一些反饋:github

typealias DictionaryOfStrings<T> = Dictionary<T, String>
// error: type 'T' does not conform to protocol 'Hashable'

幹得漂亮。swift

SE-0049將 @noescape 和 @autoclosure 關鍵字做爲類型屬性,這也遵循了以前的一個提議,把描述類型特徵的東西變成類型的一部分。api

func f(fn : @noescape () -> ()) {}     // 類型屬性
func f2(a : @autoclosure () -> ()) {}  // 類型屬性

SE-0036爲枚舉實例中的成員命名前部添加點(.)標記,這使得以前能夠不經過點表示法訪問枚舉判斷的例外狀況成爲了避免可能。也就統一了實例訪問靜態成員變量的方式。安全

SE-0062使用 Objective-C 中的鍵值路徑,經過編譯器檢查鍵值路徑表達式的合法性來提升了代碼(對於 KVC 和 KVO 來講)的安全性和可靠性。新的 #keyPath() 表達式可以在編譯時擴展爲一個鍵值路徑的字符串常量,編譯器就能夠檢查它的合法性了。閉包

#keyPath 表達式相比於 Objective-C 形式的 key-path 字符串,程序員再也不須要手動輸入並檢查暴露給 Objective-C 的鍵值路徑。app

SE-0064使用 Objective-C 中 selector 來獲取屬性的 getter 和 setter 方法,這基於 SE-0022 進行了擴展,爲 #selector 表達式擴展了對屬性方法的支持。ide

let firstNameGetter = #selector(getter: Person.firstName)
let firstNameSetter = #selector(setter: Person.firstName)

SE-0057引入 Objective-C 中的輕量級泛型,這使得在 Swift 中使用 ObjC 中新的參數類型(譯者注:好比 MySet<NSValue *> *)成爲了可能。函數

Cocoa 和 Cocoa Touch 爲了提升靜態類型安全和可讀性,包含了大量的 Objective-C 輕量級泛型參數的 API。然而在因爲類型參數在導入到 Swift 中會丟失,事實上在 Swift 中這麼作會沒有 Objective-C 中那麼安全

這個提議讓 ObjC 類中參數類型的工做方式相似於 Swift 的泛型語法。

SE-0063Swift 包管理器系統模塊搜索路徑讓 Swift 可以更好地支持除了 /usr/lib 和 /usr/local/lib 外 C 函數庫的引用。它爲 brew 和 apt-get 提供了支持,而且引入了 pkgConfigName 入口,使得編譯器可以在 Swift 包管理器中 .pc 文件外搜尋其餘路徑。

推遲的

SE-0058容許 Swift 類型提供自定義的 Objective-C 表現形式推遲到 Swift 3 以後。這個提案提出了一個ObjectiveCBridgeable協議,容許 Swift 類型轉換成一個獨立的 @objc 類型,從而控制其在 Objective-C 中的表現形式。這可讓庫做者開發真正原生的 Swift API,同時讓它支持 Objective-C:

確實,容許庫做者把本身的類型(像 Foundation 那樣)從 Objective-C 橋接到 Swift 很是重要。然而,目前咱們沒有信心把 _ObjectiveCBridgeable 開放出來。在當前階段,就像協議名暗示的那樣,這個協議的目的是把 Objective-C 對象類型橋接到 Swift。將來咱們想實現其餘平臺的橋接,包括 C++ 值類型和其餘對象系統,好比 COM、GObject、JVM 和 CLR。目前尚未肯定具體的實現方式,多是擴展示有機制,多是針對每種類型建立新協議。這個領域還須要探索,因此目前還沒法開放這個 API。

正在進行審覈的

等待審覈的

本文由 SwiftGG 翻譯組翻譯,已經得到做者翻譯受權,最新文章請訪問 http://swift.gg

相關文章
相關標籤/搜索