Swift5 新特性預覽
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/
相關文章
- Swift 4.2 新特性預覽Swift
- Vue.js 3.0 新特性預覽Vue.js
- Win10 Build 18234新預覽版釋出 新特性一覽Win10UI
- 最全的Vue3.0新特性預覽(翻譯)Vue
- 炫酷報表工具 FineReport 9.0新特性預覽
- Oracle 21c新特性預覽與日常管理相關的幾個新特性Oracle
- Swift 5 新特性預覽(最低支援Xcode 10.2 beta版)SwiftXCode
- Swoole v5.0 版本新特性預覽之新的執行模式模式
- Swift 4.1 新特性概覽Swift
- MongoDB 5.0新特性概覽MongoDB
- Flutter Beta 3 新特性概覽Flutter
- golang1.16新特性速覽Golang
- Kubernetes v1.27 新特性一覽
- Chrome 瀏覽器 131 版本新特性Chrome瀏覽器
- Redis 7.0 新功能新特性總覽Redis
- 【譯】C# 11 特性的早期預覽C#
- PHP 7.4 新特性 —— 預載入PHP
- 直播回顧| Apache Pulsar 2.10.0 新特性概覽Apache
- JDK 16 即將釋出,新特性速覽!JDK
- maven工程指定版本號並開啟預覽特性Maven
- java8 新特性之預設方法Java
- CSS3 和 HTML5 新特性一覽CSSS3HTML
- Kubernetes v1.23.0 正式釋出,新特性一覽
- 多圖預警,種草 DevTools 新特性( Chrome 80 )devChrome
- 新特性
- GitHub 桌面版 v3.0 新特性「GitHub 熱點速覽」Github
- 預覽
- 大咖帶你解讀 PostgreSQL 15 新特性 | 直播預告SQL
- React 新特性React
- 新特性介面
- Hadoop新特性Hadoop
- PHP 7.4 新特性 - 預載入 (Preloading),你需要了解這些!PHP
- html預覽HTML
- 程式設計師應該關心的iOS12新特性一覽程式設計師iOS
- 微軟介紹Edge瀏覽器新特性,支援筆記同步DROP等微軟瀏覽器筆記
- kkFileView預覽檔案 指定預覽方式為pdfView
- Java 11新特性Java
- Java 8 新特性Java