小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

一圖讀懂 Swift 5.3

 泰榮林黑皮 2020-09-23


作者 | Holly Borla 
來源 | swift.org/blog

Swift 5.3 正式發(fā)布,Amy Tsai 繪制了一張素描圖,列出了 Swift 5.3 的主要新特性。這張圖描述了 Swift 5.3 的一些新特性以及目標(biāo):繼續(xù)專注于語言改進(jìn),開發(fā)體驗以及擴(kuò)展 Swift 生態(tài)系統(tǒng),以讓 Swift 適用于更多場景。

語言和標(biāo)準(zhǔn)庫

新特性和改進(jìn)

Swift 5.3 在語言方面做了不少改進(jìn),改善了 Swift 編碼體驗。這些更新的重點是減少樣板和冗余代碼,以及在標(biāo)準(zhǔn)庫中定義更多功能,從而提高 Swift 程序員的生產(chǎn)力。

Swift Evolution 中的以下條款在 Swift 5.3 中得以實現(xiàn):

  • SE-0263 - Add a String Initializer with Access to Uninitialized Storage

  • SE-0266 - Synthesized Comparable conformance for enum types

  • SE-0267 - where clauses on contextually generic declarations

  • SE-0268 - Refine didSet Semantics

  • SE-0269 - Increase availability of implicit self in @escaping closures when reference cycles are unlikely to occur

  • SE-0276 - Multi-Pattern Catch Clauses

  • SE-0277 - Float16

  • SE-0279 - Multiple Trailing Closures

  • SE-0280 - Enum cases as protocol witnesses

  • SE-0281 - @main: Type-Based Program Entry Points

  • SE-0282 - Clarify the Swift memory consistency model ??

  • SE-0285 - Ease the transition to concise magic file strings

  • SE-0286 - Forward-scan matching for trailing closures

Swift 5.3 還修復(fù)了幾個常見的編譯器限制問題:

  • SR-75 - Unapplied references to protocol requirements are now supported

  • SR-7083 - lazy properties can define didSet and willSet accessors

  • SR-8814 - Generic classes can use default implementations of protocol requirements when conforming to protocols with associated types

運行時性能改進(jìn)

Swift 5.3 顯著改善了進(jìn)進(jìn)制代碼大小和運行時內(nèi)存使用率。這些改進(jìn)所帶來的成果通過多個項目得到了驗證:

  • 從 Swift 4 開始,Swift 團(tuán)隊就通過一個 UIKit 應(yīng)用(用 Objective-C 編寫)來衡量 Swift 重寫的二進(jìn)制代碼大小。Swift 4 的代碼量約為 Objective-C 的 2.3 倍,到 Swift 5.3 時降到 1.5 倍以下。

  • 基于 SwiftUI 的開源應(yīng)用 MovieSwiftUI,Swift 5.3 重寫的代碼量與 Swift 5.1 相比,減少了 40% 以上;

  • 在一個創(chuàng)建包含 400 個模型對象的數(shù)組的測試應(yīng)用程序中,由于運行時開銷而導(dǎo)致的堆內(nèi)存比 Swift 5.1 中使用的堆內(nèi)存少了 2/3。

二進(jìn)制大小的改進(jìn)因使用方式而有所不同。這種改進(jìn)對通過減小“值函數(shù)”的大小來聲明大量類型的項目意義特別重大,“值函數(shù)”是編譯器為創(chuàng)建,復(fù)制和銷毀值類型而生成的不可見函數(shù)。這對 SwiftUI 應(yīng)用程序特別有利。

此外,Swift 應(yīng)用程序現(xiàn)在在運行時的堆內(nèi)存開銷比較低。Swift 運行時在運行時會緩存較少的信息以跟蹤協(xié)議一致性之類的信息,而運行時的改進(jìn)使這類緩存的必要性降低?,F(xiàn)在,用 Swift 編寫的應(yīng)用程序比使用 Objective-C 編寫的其他程序所使用的堆內(nèi)存更少。

開發(fā)體驗

縮進(jìn)

Swift 5.3 修改了 SourceKit 中的自動縮進(jìn)實現(xiàn),在以下幾種情形下,自動縮進(jìn)有了很大的改進(jìn):

  • 裝飾的鏈?zhǔn)椒椒ㄕ{(diào)用;

  • 調(diào)用時跨越多行的參數(shù)、集合元素;

  • if, guard 和 while 的條件分多行時

代碼補全

Swift 5.3 進(jìn)一步優(yōu)化了代碼補全的性能和質(zhì)量:

  • 與 5.2 相比,函數(shù)體內(nèi)的重復(fù)的代碼補全現(xiàn)在快了 15 倍;這是通過在同一文件中重用一些已完成的計算操作來實現(xiàn)的。這些優(yōu)化在 Xcode 和 SourceKit-LSP 中都可用

  • Swift 代碼補全現(xiàn)在支持用戶定義的類型的可調(diào)用值(SE-0253)。代碼補全顯示了在基本表達(dá)式后加上圓括號的調(diào)用簽名

優(yōu)化構(gòu)建

Swift 5.3 為編譯器如何處理 Swift 代碼中的聲明引入了新策略。這些更改帶來了一些顯著的優(yōu)化:

  • 通過避免跨源文件重復(fù)進(jìn)行編譯器工作,并更準(zhǔn)確地標(biāo)識與以前的構(gòu)建相比未更改的代碼,從而縮短了增量構(gòu)建時間;

  • 通過修復(fù)編譯器的行為對聲明順序或嵌套敏感的多種情況,提高了正確性;

  • 使用從其他庫導(dǎo)入的有大量屬性和函數(shù)的類型的代碼,可以更快地進(jìn)行編譯;

這些優(yōu)化是通過在編譯器中更廣泛地采用新的集中式框架來實現(xiàn)的,該框架可記錄細(xì)粒度的依賴項信息,緩存可能需要重復(fù)進(jìn)行的昂貴計算結(jié)果,并自動在 Swift 代碼中檢測依賴項周期。

診斷

Swift 5.3 在 Swift 5.2 的診斷優(yōu)化基礎(chǔ)上,又進(jìn)一步提高了錯誤消息的質(zhì)量和準(zhǔn)確性,尤其是在 SwiftUI 代碼中。更具體地說,Swift 5.3 現(xiàn)在已完成向新診斷體系結(jié)構(gòu)的過渡!

5.3 中的許多診斷優(yōu)化都涉及復(fù)雜的泛型代碼,其中泛型參數(shù)會有一些錯誤的情況,例如缺少一致性。例如,考慮以下代碼:

struct FormList<FieldID> {
init<Data: Collection>(_ data: Data) where Data.Element: Identifiable,
FieldID == Data.Element.ID { ... }
}

struct Field {
let id: String
}

func createForm(fields: [Field]) {
let form = FormList(fields)
}

在 Swift 5.2 中,編譯器會報告了一個非常隱秘的錯誤消息:

error: expression type 'FormList<_>' is ambiguous without more context
let form = FormList(fields)
^~~~~~~~~~~~~~~~

在 Swift 5.3 中,編譯器可以正確報告問題,并提供有用的注釋:

error: initializer 'init(_:)' requires that 'Field' conform to 'Identifiable'
let form = FormList(fields)
^

note: where 'Data.Element' = 'Field'
init<Data: Collection>(_ data: Data) where Data.Element: Identifiable,
^

調(diào)試

Swift 5.3 為運行時錯誤提供了更好的錯誤消息。當(dāng)調(diào)試信息可用時,調(diào)試器現(xiàn)在將在標(biāo)準(zhǔn)庫中顯示陷阱的原因,而不僅僅是顯示不透明的無效指令崩潰。

現(xiàn)在,當(dāng)調(diào)試在不同計算機(jī)上編譯的二進(jìn)制文件時,LLDB 更加強(qiáng)大:

  • 來自構(gòu)建機(jī)器的 SDK 路徑會自動識別并重新映射到本地路徑;

  • 源和包含路徑可以選擇使用 .dSYM 路徑重映射字典進(jìn)行重映射;

生態(tài)

Swift Package Manager

資源(SE-0271)

包現(xiàn)在可以包含運行時所需的資源,例如圖像和其他數(shù)據(jù)文件。資源按 target 確定范圍,并在構(gòu)建程序包時進(jìn)行處理并嵌入到客戶端應(yīng)用程序中??梢允褂?Foundation 的 Bundle API 從源碼中訪問資源。

Apple 平臺特有的資源(例如資源目錄,storyboards 和 CoreData 模型)只能在 Xcode 中構(gòu)建,但是所有平臺都支持通用資源。包清單中的新 API 提供了對將哪些源文件視為資源的控制。

本地化(SE-0278)

包現(xiàn)在可以包含可本地化的內(nèi)容,例如 .strings 文件和資源的本地化變體??杀镜鼗膬?nèi)容可以使用 .lproj 目錄添加到程序包中,并且可以使用 Foundation API 進(jìn)行訪問。

二進(jìn)制依賴性(SE-0272)

軟件包現(xiàn)在可以以 XCFrameworks 形式分發(fā)預(yù)構(gòu)建庫,從而允許依賴于不能作為源代碼分發(fā)的庫。該功能當(dāng)前僅在為 Apple 平臺構(gòu)建時可用。包清單中的新 API 允許 XCFrameworks 被引用為二進(jìn)制目標(biāo)。

條件目標(biāo)依賴(SE-0273)

現(xiàn)在可以將軟件包目標(biāo)的依賴項聲明為有條件的,可以用來限制平臺的依賴項。這為描述支持多個平臺的復(fù)雜目標(biāo)依賴關(guān)系提供了更大的靈活性。

請注意,基于構(gòu)建配置的條件也是 Swift Evolution 的一部分,但尚未實現(xiàn),因此不是 Swift 5.3 的一部分。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多