Swift 週報 第十期

語言: CN / TW / HK

攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第6天,點選檢視活動詳情

前言

前幾期週報內容是同步翻譯的英文版週報,目前英文版停更,週報停滯半年多。經過多次討論,我們決定重啟週報,分模組整理內容同步給大家。

週報內容模組分為:新聞提案Swift論壇推薦博文。初期計劃每兩週釋出一期,歡迎志同道合的朋友一起加入週報整理。

昨日的生活與工作是否也曾迷茫?對新技術渴望突破的心是否依舊執著?Swift社群,為你的技術棧添磚加瓦,你,準備好了嗎?

新聞和社群

蘋果先買後付服務被警告:破壞這一新興行業的競爭

據英國《金融時報》7月27日報道,美國消費者金融保護局羅希特·喬普拉向矽谷發出警告。大型科技公司進入“先買後付”貸款業務會破壞這一新興行業的競爭,他還對客戶資料的使用提出了質疑。此前6月6日蘋果公司在年度開發者大會上推出“先買後付”的“Apple Pay Later”服務,允許使用者6周內分4期付款,期間不產生利息等其他費用。(via 泰山財經)

與 App Store 專家會面交流

準備好與專家線上交流探討,瞭解如何充分利用 App Store 的功能。探索如何吸引新顧客、測試營銷策略、新增訂閱等等。在整個 8 月,蘋果官方將在多個時區以多種語言進行實時演講和答疑。如果您也是蘋果開發者的話,最近肯定收到了相關的郵件邀請吧,不知道您是否參加了本次會面交流呢?(Apple Developer Program)

即將從 XML Feed 過渡到 App Store Connect API

App Store Connect REST API 讓您可以跨各種開發者工具自定義任務並實現任務自動化,使工作流程更靈活、更高效。從 2022 年 11 月開始,您將需要使用此 API 來代替 XML Feed,從而實現對 App 內購買專案、訂閱、元資料和 App 定價的自動化管理。XML Feed 將繼續為現有的 Game Center 管理功能提供支援。(Apple Developer News)

新功能 RoomPlan

使用 RoomPlan 建立房間的 3D 戶型圖,包括傢俱的尺寸和型別等關鍵特徵。這個是由 ARKit 提供支援的全新 Swift API 能夠利用 iPhone 和 iPad 上的攝像頭和鐳射雷達掃描器將現實環境帶入您的 App 中。

使用詳情可以觀看 WWDC22 中的 使用 RoomPlan 建立引數 3D 房間掃描

立即註冊 WWDC22 實驗室和聊天室

註冊實驗室和線上聊天室,即可在一整週內與 Apple 工程師、設計師和專家線上交流。

已推出 Xcode 14 Beta 版

包含了適用於所有 Apple 平臺 SDK 的 Xcode 14 Beta 版現已推出。利用簡潔且強大的 Swift 和 SwiftUI 以及全新的跨平臺 App 體驗,使用編輯器的增強功能更快捷地編寫程式碼,並著手開始進行從 Xcode CloudTestFlight 以及 App Store 的測試和部署。

下載 Xcode 14 Beta 版

提案

通過的提案

SE-0352: 隱式開放的存在型別 狀態:Swift 5.7 已實現 Swift 中的存在型別允許儲存一個特定型別為未知的值,且可能在執行時更改。被儲存值的動態型別,我們稱為存在型別的底層型別,僅由它遵循的協議集以及潛在的超類知道。儘管存在型別對於表達動態型別的值非常有用,但由於它們的動態性質,它們受到一定限制。最近的提議使存在型別更加明確,以幫助開發人員理解這種動態性質,並通過消除一些限制使存在型別更具表現力。但是存在型別中的基本型別仍然存在,一旦你有一個存在型別的值,你就很難對其使用泛型。開發者通常會遇到 protocol 'P' as a type cannot conform to itself 這樣的報錯問題。

SE-0352: 隱式開放的存在型別 已於 2022 年 5 月 18 日完成,核心團隊已決定接受該提案。第二次審查的重點是關注向前相容性,當一個呼叫喚起一個隱式開放的存在型別,必須被抹除型別以防止存在的動態型別記憶體洩漏到返回值中。當存在型別的表達能力增加,我們可能會有能力使用一個更具體的型別作為這一個呼叫的返回型別,這可能造成源中斷。為了避免這種情況,該提案要求在呼叫中顯式地作為任何 P 型別註釋,其中當前可以表達的返回型別將丟棄對被型別擦除的原始關聯型別的約束,如提案中的示例所示:

```swift protocol P { associatedtype A } protocol Q { associatedtype B: P where B.A == Int }

func getP( p: T) func getBFromQ( q: T) -> T.B { ... }

func eraseQAssoc(q: any Q) { let x = getBFromQ(q) // 錯誤,必須指定 "as any P" 由於缺少 T.B.A == Int 的約束 let y = getBFromQ(q) as any P // 可以, 明確拋棄約束 } ```

SE-0353: 受約束的存在型別 狀態:Swift 5.7 已實現 存在型別彌補了 Swift 型別系統中的抽象能力。與泛型一樣,它們使函式能夠獲取和返回多種可能的型別。與泛型引數型別不同,存在型別在作為輸入傳遞給函式時不需要預先知道。此外,當從函式返回時,可以刪除具體型別(隱藏在協議介面後面)。在這個領域出現了一系列活動,SE-0309 解除了對使用具有關聯型別的協議作為存在型別的剩餘限制,而 SE-0346 為關聯型別協議的輕量級約束語法鋪平了道路。該提案直接基於這些想法,旨在在存在型別的上下文中重用輕量級關聯型別約束的語法。

swift any Collection<String>

SE-0356: Swift 程式碼片段 該提案描述了編寫成為片段的新形式示例程式碼的約定。片段是簡短的單檔案示例,可以在 Swift 包中構建和執行,可以訪問該包中的其他程式碼,並且可以以多種方式使用。

正在審查的提案

SE-0359: 構建時間常數值 狀態:已接受 構建時間常數值是一個 Swift 語言特性,要求在編譯時知道某些值。這是通過屬性、@const、約束屬性和函式引數來實現的,以使其具有編譯時可知的值。這些資訊為未來更豐富的編譯時特性奠定了基礎,例如在編譯時提取和驗證值。

SE-0362: 即將到來的語言改進的逐漸採用 狀態:已接受 Swift 6 積累了許多對語言有原始碼相容性影響的改進,從而在以前的語言模式(Swift 4.x 和 Swift 5.x)中預設情況下無法啟用它們。這些改進已經在背後為 Swift 6 語言模式的 Swift 編譯器中實現,但他們對於開發者是無法訪問的,並將持續直到 Swift 6 作為一個可獲得的語言模式。這有很多原因,為什麼我們應該思考儘快提供這些改動。

  • 開發者希望很快從這些改進中受益,而不是等到 Swift 6 可用。
  • 向開發者提供這些改進比 Swift 6 提供更多體驗優先順序更高,如果有必要,允許我們針對 Swift 6 進一步除錯它們。
  • 對於某些模組,所有在 Swift 6 中改動的總數或許會造成遷移繁重,並且在 Swift 4.x/5.x 中逐一採納這些語言改動,可以使過渡期路徑變得絲滑。

一些提案已經引入了定製解決方案來提供遷移路徑:SE-0337 添加了 -warn-concurrency 在 Swift 4.x/5.x 中啟用與 Sendable 相關檢查的警告。 SE-0354 新增標誌 -enable-bare-slash-regex 以啟用原始 /.../ 正則表示式語法。儘管它不是提案的一部分,但對 SE-0335 的討論包括對編譯器標誌的請求,以在存在型別上要求使用 any 。這些都具有相同的風格,即選擇現有的 Swift 4.x/5.x 程式碼進行改進,這些改進將出現在 Swift 6 中。

這個提議明確地包含了零碎的、有意採用的特性,這些特性在 Swift 6 之前出於原始碼相容性的原因而保留。它為逐步採用 Swift 6 特性建立了一條直接路徑,以在 Swift 4.x/5.x 程式碼庫中獲得它們的優勢,並順利遷移到 Swift 6 語言模式。開發人員可以使用新的編譯器標誌 -enable-upcoming-feature X 為該模組啟用名為 X 的特定功能,並且可以以這種方式指定多個功能。當開發人員移動到下一個主要語言版本時,該語言版本將隱含 X 並且編譯器標誌將被拒絕。這樣,即將推出的功能標誌只會累積到下一個主要的 Swift 語言版本,然後被清除,所以我們不會將語言分拆成不相容的方言。

Swift論壇

  1. SwiftUI 中的新功能 圍繞 WWDC2022-10052 內容進行討論

  2. Swift 正則表示式 圍繞 WWDC2022-110357 內容進行討論

  3. SwiftUI 導航 圍繞 WWDC2022-10054 內容進行討論

  4. Swift 圖表 圍繞 WWDC2022-10137 內容進行討論

  5. 使用 cmake 構建 swift 而不是 build-script

build-scriptbuild-script-impl 的 python 包裝器,本身是一個 shell 指令碼,然後執行 CMake,執行可以構建專案的工作主體。 例如,如果您想執行 utils/build-script -x,將呼叫 cmake -G Xcode

  1. Visual Studio Code 增加擴充套件包 支援 Swift 開發

  2. SwiftNIO _ChannelInboundHandler 與 DocC 不相容

在閱讀 swift-biome 中的 SwiftNIO 文件時,遇到一個問題。文件其中引用了 3 個帶下劃線的屬性。例如:_ChannelInboundHandler_EmittingChannelHandler 等,但是這些屬性在 swift-biome 和其他基於 SymbolGraphGen 的工具是不可見的,包括 DocC。

  1. Foundation 中基於 KeyPath 的對比 API

Foundation 中引入的 KeyPathComparator API,比 Swift 中的 sorted(by:) 方法更清晰。這個 API 可以根據陣列中的某個特定元素進行排序。

推薦博文

SwiftUI 動畫系列,文章結合動畫 Gif 原圖和原始碼為案例,深入探討了如何建立應用 SwiftUI 動畫。

高階 SwiftUI 動畫 — Part 1:Paths

摘要: 本文主要介紹了顯式動畫和隱式動畫,以及針對 Animatable 協議的相關討論。

高階 SwiftUI 動畫 — Part 2:GeometryEffect

摘要: 主要介紹使用新工具 GeometryEffect 建立 SwiftUI 動畫。GeometryEffect是一個符合Animatable 和 ViewModifier 的協議。

高階 SwiftUI 動畫 — Part 3:AnimatableModifier

摘要: 本文主要介紹使用 AnimatableModifier 完成更加複雜的動畫效果。AnimatableModifier 是一個 ViewModifier,符合 Animatable 協議,如果對這個協議不瞭解可以閱讀之前釋出的兩篇文章。

SwiftUI 動畫進階 — Part4:TimelineView

摘要: 前三篇高階 SwiftUI 動畫是作者在實戰中總結的內容。本篇文章,我們將詳細地探索 TimelineView。

SwiftUI 動畫進階 — Part 5:Canvas

摘要: 本篇文章將探索 Canvas 檢視。從技術上講,它不是一個動畫檢視,但當它與第四部分的 TimelineView 結合時,可以現實很多有趣的功能。

關於我們

Swift社群是由 Swift 愛好者共同維護的公益組織,我們會分享以 Swift實戰SwiftUlSwift基礎為核心的技術內容,也整理收集優秀的學習資料。

特別感謝 Swift社群 編輯部的每一位編輯,感謝大家的辛苦付出,為 Swift社群 提供優質內容,為 Swift 語言的發展貢獻自己的力量。