日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

一圖讀懂 Swift 5.3

 泰榮林黑皮 2020-09-23


作者 | Holly Borla 
來(lái)源 | swift.org/blog

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

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

新特性和改進(jìn)

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

Swift Evolution 中的以下條款在 Swift 5.3 中得以實(shí)現(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ù)了幾個(gè)常見(jiàn)的編譯器限制問(wèn)題:

  • 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

運(yùn)行時(shí)性能改進(jìn)

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

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

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

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

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

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

開(kāi)發(fā)體驗(yàn)

縮進(jìn)

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

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

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

  • if, guard 和 while 的條件分多行時(shí)

代碼補(bǔ)全

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

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

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

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

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

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

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

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

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

診斷

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

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

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 中,編譯器會(huì)報(bào)告了一個(gè)非常隱秘的錯(cuò)誤消息:

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

在 Swift 5.3 中,編譯器可以正確報(bào)告問(wèn)題,并提供有用的注釋:

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 為運(yùn)行時(shí)錯(cuò)誤提供了更好的錯(cuò)誤消息。當(dāng)調(diào)試信息可用時(shí),調(diào)試器現(xiàn)在將在標(biāo)準(zhǔn)庫(kù)中顯示陷阱的原因,而不僅僅是顯示不透明的無(wú)效指令崩潰。

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

  • 來(lái)自構(gòu)建機(jī)器的 SDK 路徑會(huì)自動(dòng)識(shí)別并重新映射到本地路徑;

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

生態(tài)

Swift Package Manager

資源(SE-0271)

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

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

本地化(SE-0278)

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

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

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

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

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

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

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多