乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      一圖讀懂 Swift 5.3

       泰榮林黑皮 2020-09-23


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

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

      語言和標準庫

      新特性和改進

      Swift 5.3 在語言方面做了不少改進,改善了 Swift 編碼體驗。這些更新的重點是減少樣板和冗余代碼,以及在標準庫中定義更多功能,從而提高 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 還修復了幾個常見的編譯器限制問題:

      • 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

      運行時性能改進

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

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

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

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

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

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

      開發(fā)體驗

      縮進

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

      • 裝飾的鏈式方法調(diào)用;

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

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

      代碼補全

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

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

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

      優(yōu)化構建

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

      • 通過避免跨源文件重復進行編譯器工作,并更準確地標識與以前的構建相比未更改的代碼,從而縮短了增量構建時間;

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

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

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

      診斷

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

      5.3 中的許多診斷優(yōu)化都涉及復雜的泛型代碼,其中泛型參數(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 為運行時錯誤提供了更好的錯誤消息。當調(diào)試信息可用時,調(diào)試器現(xiàn)在將在標準庫中顯示陷阱的原因,而不僅僅是顯示不透明的無效指令崩潰。

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

      • 來自構建機器的 SDK 路徑會自動識別并重新映射到本地路徑;

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

      生態(tài)

      Swift Package Manager

      資源(SE-0271)

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

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

      本地化(SE-0278)

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

      二進制依賴性(SE-0272)

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

      條件目標依賴(SE-0273)

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

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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多