Swift5 新特性預覽

ZY_FlyWay發表於2019-03-29

Apple將在今年晚些時候大概秋季釋出會釋出Swift5,Swift5主要焦點在於ABI(Application Binary Interface)對於Swift標準庫的穩定,下面介紹Swift5特性:

1.ABI穩定

1.1什麼是ABI穩定

  • 在執行時Swift二進位制檔案通過ABI與其他的庫與元件進行互動,他定義了底層的細節比如函式如何呼叫,資料如何在記憶體中呈現,後設資料在哪裡,以及如何訪問等等。

  • 當前已釋出的Swift版本中ABI還沒穩定,所以每一個APP,都自己包含它Swift版本所對應的Swift Dynamic Library。Swift並沒包含在作業系統中,他存在於每一個APP內部。

  • 這意味著任何一個App,比如APP1使用Swift3.0,那麼它將包含Swift 3.0 動態庫(3.0 ABI)在它內部,但是其他的APP比如APP2它使用Swift3.2,他將包含自己的3.2ABI.

  • 如果Swift ABI穩定下來,Swift將包含在iOS作業系統裡邊,它將相容每一個Swift版本,比如APP1使用Swift5.0,但是App2使用Swift5.3,他們都將包含在iOS 內部。

1.2為什麼是ABI穩定是重要的

  • Swift包 Size將變小

  • 語言將變化越小,不在那麼頻繁

  • 更小的遷移

  • 開發者將可以預編譯好Frameworks(當前版本frameworks在 APP編譯時編譯)

1.3ABI穩定帶來的缺點

限制公共介面和符號的變化

限制了Swift的迅速發展

2.Async/Await模式

2.1 Async

  • 非同步方案在C#, Python, Javascript 中取得了巨大成功

  • Async關鍵字使用類似於現有的throws關鍵詞

  • 宣告一個非同步函式內部為具有時序非同步執行協同函式

2.2 Await

  • 類似於try關鍵詞

  • 宣告一個在某一時間點執行的函式,並獲得執行結果

2.3 為什麼使用Async/Await

  • 當執行多個操作建立複雜的邏輯時,目前版本非同步api很low,比如錯誤處理,回撥函式。

  • 當前版本的非同步回撥閉包讓程式碼很醜陋。

  • 難以理解的佇列/執行緒。

2.4 例子

為了展示Async/Await的優雅寫法,這裡以Cocoa開發者遇到的非同步問題舉例,比如下面的非同步問題:

func loadWebResource(_ path: String, completionBlock: (result: Resource) -> Void) { ... }
func decodeImage(_ r1: Resource, _ r2: Resource, completionBlock: (result: Image) -> Void)
func dewarpAndCleanupImage(_ i : Image, completionBlock: (result: Image) -> Void)
func processImageData1(completionBlock: (result: Image) -> Void) {
   loadWebResource("dataprofile.txt") { dataResource in
      loadWebResource("imagedata.dat") { imageResource in
         decodeImage(dataResource, imageResource) { imageTmp in
            dewarpAndCleanupImage(imageTmp) { imageResult in
               completionBlock(imageResult)
             }
          }
       }
    }
}

現在你可以這樣優雅的寫

func loadWebResource(_ path: String) async -> Resource
func decodeImage(_ r1: Resource, _ r2: Resource) async -> Image
func dewarpAndCleanupImage(_ i : Image) async -> Image
func processImageData1() async -> Image {
    let dataResource = await loadWebResource("dataprofile.txt")
    let imageResource = await loadWebResource("imagedata.dat")
    let imageTmp = await decodeImage(dataResource, imageResource)
    let imageResult = await dewarpAndCleanupImage(imageTmp)
    return imageResult
}

3.Actors

  • Actor是DispatchQueue的組合,他的資料被這個佇列保護,而且只能在這個佇列執行

  • Actor是新的型別比如class, struct or protocol

  • Actor允許開發者定義內部變數和函式,在它內部處理資料或者做一些操作。

  • Actor沒有引數和返回值,不能丟擲錯誤

  • 開發者可以非同步地與Actor進行通訊,並且它保證他們保護的資料只被在該佇列上執行的程式碼所訪問

  • UIKit和AppKit會使用MainActor對“Main Thread”進行建模

  • 開發者可以定義MainActor的擴充套件,以便在主執行緒上執行他們的程式碼

  • Actor引用計數為0並且最後排隊的訊息完成時,Actor會釋放。

  • 讓我們想象一下,我們正在為具有帶有字串列表的tableview的應用程式構建資料模型。該應用程式具有新增和操作列表的UI。它可能看起來像這樣:

actor TableModel {
    let mainActor : TheMainActor
    var theList : [String] = [] {
        didSet {
            mainActor.updateTableView(theList)
        }
    }
    
    init(mainActor: TheMainActor) { 
        self.mainActor = mainActor 
    }

    actor func add(entry: String) {
      theList.append(entry)
    }
  }

4.其他的優化

  • String優化,語言層面對正規表示式的支援,提高String效能

  • 標準庫優化

  • Foundation優化

  • 語法新增

原文連結:https://www.developerinsider.in/what-will-be-new-in-swift-5/

相關文章