TOP

Swift 3.1 的一些新特性
2017-10-09 14:29:51 】 瀏覽:9442
Tags:

Apple終于發布了Xcode 8.3以及Swift 3.1。如果你沒時間仔細通讀一遍release note,至少优乐棋牌app下载,Swift 3.1中的一些新特性還是值得了解的,為此,我們特別制作了一個免費的內容系列。當然,Swift 3.1和Swift 3在源代碼級別是兼容的,因此,如果你的項目已經更新到了Swift 3,這次更新應該不會給你帶來太多麻煩。但是,Xcode 8.3去掉了對Swift 2.3的支持,所以,如果你還停留在更早版本的Swift上,就還是謹慎更新的為好。

接下來,我們就簡單介紹下這個系列里的內容。

SE-0080 數值類型的failable initialize

這是SE-0080帶來的改進。例如,之前,當我們把一個Double強制轉換成Int的時候,Swift會自動取消小數點后的部分。當我們需要在不同的數字類型之間執行“無損”的精度轉換時,這個功能就非常有用,當轉型會導致精度丟失的時候,init(exactly:)方法會給我們返回nil。我們通過一個最常見的場景:解析服務器返回的JSON,向大家展示了這個功能的具體用法。

SE-0045 Sequence中新添加的兩個篩選元素的方法

prefix(while:)drop(while:)是Swift 3.1中新加入到Sequence類型的兩個API方法,通過它們,可以幫助我們更有效的編寫在Sequence中篩選元素的方法。特別是,如果我們要在一個無限序列中篩選元素,它們就顯得更方便了。

SE-0103 臨時轉換成escaping的closure

就像SE-0103中描述的一樣,在Swift 3里优乐棋牌app下载,函數的closure類型參數默認從escaping變成了non-escaping。這很好理解,因為大多數用于函數式編程的closure參數的確都以non-escaping的方式工作。

但這份提議也提到了一個問題,就是有時候优乐棋牌app下载,我們需要把non-escaping屬性的closure,傳遞給需要escaping屬性closure的函數。什么時候需要這種場景呢?也許你在其他地方看到的解釋是:這是一個不太常見的用法。

SE-0141 通過available約束Swift版本

雖然之前我們可以通過#if這樣的形式達到版本控制的目的,但如果我們用這樣的方式編寫程序庫,就會有一個不太方便的地方。編譯器要為它支持的每一個Swift版本都獨立編譯一遍。于是,如果在一個Swift ABI累積性更新之間兼容了多個Swift版本,那么攜帶這段時間編寫的程序庫就是一個比較笨重的事情。一個更好的辦法,當然應該是只編譯一次,然后在生成的程序庫包含每個API可以支持的Swift版本。

為此Swift 3.1中,對@available進行了擴展,我們不僅可以用它來約束操作系統,還可以指定Swift的版本。

SR-1009 使用具象類型約束泛型參數

在Swift 3.0中,如果我們要為某個特定類型的Optional添加extension,不是一件太容易的事情。我們得通過用protocol約束一個類型相同的computed property來模擬某個具象類型的約束。但在Swift 3.1里,這個缺陷被彌補了,我們不僅可以對泛型參數使用protocol進行約束,還可以使用具象類型作為類型約束,這有點兒像C++泛型中的模板偏特化技術。

SR-1446 關于內嵌類型的兩種改進

這一部分,我們來聊聊和內嵌類型有關的話題。在Swift 3.1里,內嵌類型有了兩方面的改進:

  • 普通類型的內嵌類型可以直接使用其外圍類型的泛型參數,此時它仍舊是一個普通類型;

  • 泛型類型的內嵌類型可以擁有和其外圍類型完全不同的泛型參數;

請關注公眾號獲取更多資料



】【打印繁體】【】【】 【】【】【】 【關閉】 【返回頂部
上一篇iOS 頁面滑動與標題切換顏色漸變.. 下一篇從Pitre《Swift 基礎教程2nd》開始