天天看點

Swift 周報 第六期

前言

譯者言:周日立冬,北方多地迎來 2021 年的第一場雪,上海也降下大雨,此時你所在的城市降溫了嗎?記得添衣保暖,避免感冒生病影響工作和生活。

Xcode 13.2 Beta 版已具備并發支援,該特性将有助于解決很多 Swift 開發者的某些痛點。或許 Swift 内置的并發系統最重要的好處是,它允許以更簡單的方式,并行執行多異步任務。可以想像,通過增加執行任務的速度這将節省我們更多時間。

Kristaps Grinbergs Swift 周報負責人在本期周報中公開自己将不再上司 Swift 周報項目,原文如下:

我非常高興地編寫這麼優秀并且已經營運了三年的 Swift 新聞周報。我遇到了很多了不起的人,并且感謝你們所有人,我已經收獲了很多! 這是為什麼打出下面這句話,讓我感慨萬千的原因。第 200 期周報将是我營運的最後一期。我已經決定不再上司這個項目,并且懷着愉悅的興奮,我正在尋找願意繼續管理 Swift 周報的人。

為了 Swift 社群周報持續穩定的釋出更新,我們希望邀請 Swift 愛好者參與周報編輯,同時邀請贊助商對我們平台贊助支援。

入門任務

SR-15408 [Swift-DocC] 用含有空格的回調顯示名稱建構文檔會産生一篇無法閱讀的文章

譯者注: 如果将帶有空格的回調顯示名稱(如 --fallback-display-name "My Display Name")以及有效的符号圖傳遞給 DocC,DocC 會生成一篇以“我的顯示名稱”作為 H1 的文章标題并将其組織在頂級架構頁面上的“文章”主題組下。

新聞和社群

新的 Xcode 13.2 Beta​ 增加了對 macOS 10.15、iOS 13、tvOS 13 和 watchOS 6 或更高版本的 Swift 并發支援。 這種支援包括async/await、actor​、全局 actor,結構化的并發及其任務 API。

Tim Condon 釋出了 Vapor​ 已經支援 async/await。

Konrad ktoso Malawski 寫了一篇介紹 Swift Distributed Actors 的文章。

Marc Aupont 将加入 Diversity in Swift 工作組。

Swift 下載下傳連結已移至新位置以提供更快的下載下傳速度! 工具鍊将托管在 download.swift.org,它将使用與目前 URL 類似的模式。 要使用新 URL,請将 swift.org/builds/ 替換為 download.swift.org/。 從 2021 年 10 月 26 日開始,swift.org/builds URL 已重定向到新的子域。

Sarun Wongpatcharapakorn 寫了一篇博文解釋 Swift 中的 KeyPath。

Commits 和 pull requests

Erik Eckstein 合并了一個 pull request​,該請求實作了性能注釋的原型​,如 Swift 中的 @_noLocks​ 和 @_noAllocation。

Slava Pestov 合并了一個 pull request​,該請求改進了對“身份一緻性”的處理 [P].[P] => [P]。

John McCall 合并了一個 pull request​,該請求修複了高度對齊的結果類型的未來片段的對齊方式

同意的提案

SE-0325 附加包插件 API 提案已被修改并同意。

正在審查的提案

SE-0326: 多語句閉包參數/結果類型推斷正在審查中.

Kristaps Grinbergs 建議通過啟用閉包體的參數和結果類型推斷,來改進多語句閉包推斷行為。 這将令類型推斷更符合開發者的預期,并且移除現存的行為壁壘,即向閉包添加一個表達式或語句會導緻編譯失敗的結果。

SE-0327: On Actors and Initialization正在審查中。

Actors 是 Swift 中相對較新的名義類型,為其可變态提供了資料競争安全性。資料保護是通過将每個 actor​ 執行個體可變狀态一次最多隔離一個任務來實作的。引入 actor(SE-0306​)的提案非常龐大和詳細,但忽略了建立和銷毀 actor​ 隔離狀态的一些細微之處。 該提案旨在支援一個 actor​ 的定義,為了弄清一個 actor​ 執行個體的資料隔離何時開始和結束,以及在一個 actor​ 的 init​ 和 deinit 函數聲明中能夠做什麼。

SE-0328:Structural opaque result 類型正在審查中。

Opaque 結果類型可以用作函數的結果類型、變量的類型或者下标的結果類型。在所有情況下, Opaque 結果類型必須是整個類型。該提案建議解除該限制,并且在“結構性”的位置中允許使用 Opaque 結果類型。

Swift 論壇

I

一個來自 @justkwin 關于 Foundation​ 如何使用 URL​ 結束來表示 file.paths​ 的小曆史教訓。

II

Anders Bertelrud 提出了添加包管理器指令插件的提案。

SE-0303 引入了第一種 SwiftPM 插件,專注于使用自定義建構工具調用擴充建構系統的能力(特别是為了生成源代碼)。 那些插件一直計劃成為第一種被 SwiftPM 支援的插件。

Kristaps Grinbergs 想提出一個提案草案,為 SwiftPM 添加另一種更通用目的的“指令插件”。 這些類型的插件可以由使用者直接調用,用于源代碼格式化、文檔生成、測試報告生成等。指令插件不一定與建構系統有任何關系。

這些自定義指令插件一個重要的方面是它們可以要求插件主機(SwiftPM 或支援包的 IDE)按需生成專門的資訊,或着初始化建構或測試運作。 這是提案草案中最需要仔細審查的部分。 在使 API 足夠豐富以令其盡可能有用,同時也使其足夠通用以不僅在 SwiftPM 中而且 IDE 中支援 Swift 包,這裡有一個相悖的因素。

III

Guillaume Lessard 提出了一項提案,該提案将實作指針族初始化改進。

UnsafeMutablePointer 系列中的類型通常需要手動管理記憶體配置設定,包括對其初始化狀态的管理。 涉及的狀态是在配置設定後:

  1. 未綁定和未初始化時(當在UnsafeMutableRawPointer.allocate() 傳回)
  2. 綁定到一個類型,并且未初始化(從UnsafeMutablePointer<T>.allocate() 傳回)
  3. 綁定到一個類型,并且初始化

無論何時它未曾被初始化,記憶體都能夠安全地銷毀。

不幸的是,不是每一個 UnsafeMutablePointer 系列中的類型有這個必要功能,以用于全面管理它記憶體初始化的狀态。 我們打算在本提案中解決這個問題,并提供在各種更廣泛的情況下管理初始化狀态的功能。

IV

Kelvin Ma 展開了一個關于 AsyncStream​ 構造函數的讨論​,該構造函數也傳回其 Continuation。

有沒有什麼方法我們可以向 AsyncStream​ 添加一個 API,它直接傳回 Continuation,進而我們就不必把它的閉包“調來調去”?

一般來說,我也覺得 AsyncStream​ 真的很難使用,因為疊代在建立了 AsyncStream​ 的同一個任務中發生,甚至是沒有并發疊代時曾出現。 這使“訂閱” actor​ 對象生成的事件變得困難,即使訂閱方法被标記為 nonisolated。

V

Adam Fowler 積極将 MQTTNIO​ 庫加入 SSWG 包清單中.

MQTT 是一種通常用于與 IoT(物聯網)裝置進行通信的消息傳遞協定。 它是一種輕量級的釋出/訂閱消息傳輸,旨在具有較小的代碼占用空間和網絡帶寬。

VI

Cory Benfield 向我們更新了​關于 SwiftNIO Swift 版本支援。

SwiftNIO 團隊已将其作為我們工作流程的主要支柱,以嘗試在相當長的時間内支援 Swift 版本。大多數使用者沒有利用這一點,更願意繼續使用最新版本的 Swift,但我們認為重要的是你要有信心,新編寫的應用程式将在未來獲得一些有意義的支援。

VII

Victoria Mitchell 寫了一篇​關于擴充 Swift-DocC​ 以支援 Objective-C 的文檔。

DocC​ 的架構目前僅支援 Swift​ 一個語言的渲染符号文檔。然而,有些跨語言項目可以從将多個“語言變體”收集到同一組文檔中受益,例如可以被 Swift​ 中調用的 Objective-C API,反之亦然。

關于我們

我們是由 Swift 愛好者共同維護,我們會分享以 Swift 實戰、SwiftUI、Swift 基礎為核心的技術内容,也整理收集優秀的學習資料。