Swift 3.1 的一些新特性

來源:互聯網
上載者:User

標籤:函數式編程   不同的   ase   序列   protoc   情境   部分   丟失   ping   

Apple終於發布了Xcode 8.3以及Swift 3.1。如果你沒時間仔細通讀一遍release note,至少,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裡,函數的closure型別參數預設從escaping變成了non-escaping。這很好理解,因為大多數用於函數式編程的closure參數的確都以non-escaping的方式工作。

但這份提議也提到了一個問題,就是有時候,我們需要把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裡,內嵌類型有了兩方面的改進:

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

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

Swift 3.1 的一些新特性

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.