Swift 5.4 正式發(fā)布,The Swift Programming Language 更新
Swift 5.4 現(xiàn)已正式發(fā)布,該版本包含各種語言和工具方面的改進。Swift 5.4 版本的 《The Swift Programming Language》也已更新,可以在?https://docs.swift.org/swift-book/?和 Apple Books store 免費查看。
語言更新
Swift 5.4 包含以下新語言功能:
? 支持函數(shù),下標和初始化程序中的多個可變參數(shù)(SE-0284)
? 擴展隱式成員語法(SE-0287)
? Result 生成器(SE-0289)
? 支持重載的本地函數(shù)
? 局部變量的屬性包裝器
同時為了為新的并發(fā)模型做準備,編譯器現(xiàn)在會在將 await 作為標識符時發(fā)出警告并進行修復。這些標識符在 SE-0296 的以后版本的 Swift 中將被解釋為關鍵字 await。
運行時性能和代碼大小的改進
在 Swift 5.4 中,由于在緩存以前的查找結果時使用了更快的哈希表實現(xiàn),因此運行時協(xié)議一致性檢查的速度顯著提高。特別是加快了運行時 as? 和 as! 的轉換操作。
此外,現(xiàn)在可以避免連續(xù)的數(shù)組修改時冗余的唯一性檢查。
func foo(_ a: inout [Int]) {
// Must do copy-on-write (CoW) check here.
a[0] = 1
// The compiler no longer generates
// a redundant CoW check here.
a[1] = 2
}
另外還有多種性能改進:
? 更有效的 String 插值操作
? 較少的 retain/release 調用,尤其是對于 inout 函數(shù)參數(shù)和循環(huán)內
? 現(xiàn)在,標準庫中的通用元數(shù)據(jù)在編譯時進行了優(yōu)化,從而減少了臟內存的使用并提高了性能
Swift Package Manager更新
Swift Package Manager 在 Swift 5.4 中有幾個重要更新:
? 現(xiàn)在,指定 5.4 工具版本的 Swift 軟件包可以顯式地將目標聲明為可執(zhí)行文件,從而允許在軟件包代碼中使用?@main?關鍵字(SE-0294)
? Windows 現(xiàn)已支持 Swift Package Manager
? Swift Package Manager 基于每個用戶緩存軟件包依賴關系,這減少了網(wǎng)絡流量,并提高了對于相同軟件包的后續(xù)使用的依賴關系解析的性能
? 現(xiàn)在,自動測試發(fā)現(xiàn)是所有平臺上的默認設置,無需再使用?LinuxMain.swift(已棄用)
? 對依賴項解析基礎結構的多項改進,包括清單加載和緩存方面的改進,從而提高了依賴項解析的性能
? 改進的診斷基礎架構和錯誤消息,導致針對依賴項解決問題及其他原因的更具操作性的錯誤消息
Windows平臺支持
在 Windows 上對 Swift 的支持已經在幾個重要方面取得了進展:
? Swift Package Manager現(xiàn)在可以在 Windows 上使用
? WinSDK模塊已擴展,涵蓋了 Windows 開發(fā)人員 SDK 的較大部分。這使得更多的 API 可以輕松地用于 Windows 應用程序,而無需手動構建庫以將 C 接口橋接到 Swift
? 對安裝程序的改進應通過減少 Windows 默認情況下所需的標志,可以更容易地使用外部工具的工具鏈
構建性能
? Swift 編譯器在跟蹤文件之間的依賴性方面要好得多,從而大大減少了在增量構建期間針對多種更改而編譯的文件數(shù)量
? 現(xiàn)在,由 Swift 編譯器分別跟蹤對成員變量以及結構,枚舉,類和協(xié)議的函數(shù)的依賴關系。更改這些實體后,這種更精細的粒度可以加快和縮小重建的過程
? 在更多情況下,增量構建會生成確定性產品
代碼補全
現(xiàn)在,在大型函數(shù)體內,代碼補全的性能要快得多。在?swift-package-manager?代碼庫中的一個示例中,在 Swift 5.4 中?self.?的代碼補全時間比 Swift 5.3 快4倍(20毫秒→5毫秒)。
現(xiàn)在,在包含錯誤的表達式中以及在沒有附加上下文的情況下模棱兩可的表達式中,代碼補全也變得更加可靠。例如,給定以下函數(shù):
func test(a: Int, b: String) -> Int { ... }
func test(a: Int, b: Int) -> String { ... }
func test(a: (Int, Int) -> Int) -> Int { ... }
對于上述代碼,代碼完成現(xiàn)在具有以下行為:
? 在?test().prefix(3).?之后會給出?String?版函數(shù)建議
? 在?test(a: 2).?后會給出?Int?版函數(shù)建議
? 在?$0.?后會給出?Int:test { $0. }?版函數(shù)建議
類型檢查器
Swift 5.4 改進了“鏈接”表達式(例如?a + b + (2 * c)?)的類型檢查性能,例如以下代碼:
struct S { var s: String? }
func test(_ a: [S]) {
_ = a.reduce("") {
($0 + "," + ($1.s ?? "")) + ($1.s ?? "") + ($1.s ?? "")
}
}
對于這段代碼,類型檢查器將在100毫秒內完成操作,之前該操作可能會超時。
此外,類型檢查器還提高了包含其他文字表達式的嵌套數(shù)組文字的性能。例如,以下無效代碼以前會在編譯器中產生“too complex to solve in reasonable time”的消息:
enum E {
case first
case second
case third
}
let dictionary = [
.first: [0, 1, 2, 3, 4, 5, 6, 7],
.second: [8, 9, 10, 11, 12, 13, 14, 15],
.third: [16, 17, 18, 19, 20, 21, 22, 23],
]
Swift 5.4 代碼現(xiàn)在通過精確的錯誤消息將該代碼診斷為無效:
error: reference to member 'first' cannot be resolved without a contextual type
.first : [ 0, 1, 2, 3, 4, 5, 6, 7],
^
error: reference to member 'second' cannot be resolved without a contextual type
.second : [ 8, 9, 10, 11, 12, 13, 14, 15],
^
error: reference to member 'third' cannot be resolved without a contextual type
.third : [16, 17, 18, 19, 20, 21, 22, 23],
^
現(xiàn)在,類型檢查器改進了對結果生成器的診斷,包括無效語句(例如無效的return語句),引用無效的聲明以及模式匹配錯誤。例如:
import SwiftUI
struct ContentView: View {
@State private var condition = false
var body: some View {
Group {
if condition {
Text("Hello, World!")
.frame(width: 300)
} else {
return Text("Hello, World!")
}
}
}
}
對于這段代碼,類型檢查器將報告以下錯誤,以及修復它的Fix-It,以刪除?return?以應用結果構建器:
error: cannot use explicit 'return' statement in the body of result builder 'SceneBuilder'
return Text("Hello, World!")
^
調試
在 Apple 平臺上調試 Swift 代碼時,具有彈性類型(包括諸如URL,URLComponents,Notification,IndexPath,Decimal,Data,Date,Global,Measurement和UUID等基礎值類型)的變量將再次顯示在 Xcode 變量視圖和?frame variable / v?命令結果中。
