Stories

Detail Return Return

碼出新宇宙,WWDC23 就在眼前 | Swift 週報 issue 30 - Stories Detail

前言

本期是 Swift 編輯組自主整理週報的第二十一期,每個模塊已初步成型。各位讀者如果有好的提議,歡迎在文末留言。

Swift 週報在 GitHub 開源,歡迎提交 issue,投稿或推薦內容。目前計劃每兩週週一發佈,歡迎志同道合的朋友一起加入週報整理。

求人不如求己,你多一樣本領,就少一點啊乞求;Swift社區讓你多一樣技能,少一些嘲諷!👊👊👊

週報精選

新聞和社區:碼出新宇宙,WWDC23 就在眼前

提案:有 4 個提案通過,本期沒有產生新的提案

Swift 論壇:PermutableCollection 協議

推薦博文:SwiftUI 中 LinearGradient的用法

話題討論:

有博主在視頻社交平台説,2023年已然迎來了經濟危機,只是有些人不願意相信而已,那麼你認為國內2023年是否真的進入了經濟危機?

上期話題結果

上期話題討論結果表明,社交隔閡個人選擇標準的提高是導致男女羣體互不干涉的主要原因,而社會觀念的變化也起到了一定的影響。這些因素共同作用導致了男羣體和女羣體相互獨立地尋找伴侶的現象。

新聞和社區

App、App 內購買項目和訂閲即將實行税率調整

App Store 的交易和支付機制旨在幫助你在覆蓋全球的 175 個國家和地區的商店中,以 44 種貨幣為你的產品和服務便捷地進行定價與銷售。Apple 會為開發者管理其中 70 多個國家和地區的税收,而且你還能夠為 App 和 App 內購買項目分配税務類別。我們會根據税務法規的變化,定期更新你在某些地區的收益。

從 5 月 31 日起,你從 App 和 App 內購買項目 (包括自動續期訂閲) 銷售中獲得的收益將進行調整,以反映以下税率調整。請注意,相關內容的價格將保持不變。

加納:增值税率從 12.5% 上調至 15%。
立陶宛:對於符合條件的電子書和有聲書,增值税率從 21% 下調至 9%。
摩爾多瓦:對於符合條件的電子書和期刊,增值税率從 20% 下調至 0%。
西班牙:收取 3% 的數字服務税。
由於巴西税務法規的變化,在巴西開展的所有 App Store 銷售現由 Apple 代扣税款。我們會按月代扣代繳應向相應税務機關繳納的税款。自 2023 年 6 月開始,你可以在 5 月份的收入中查看從你的收益中扣除的税款金額。巴西境內的開發者不會受到這一變化的影響。

以上調整生效後,App Store Connect 中“我的 App”的“價格與銷售範圍”部分會隨即更新。一如既往,你可以隨時更改你的 App 和 App 內購買項目的價格 (包括自動續期訂閲)。現在,你可以從 900 個價格點中選擇,為任何店面更改定價。

碼出新宇宙

WWDC23 就在眼前。太平洋夏令時間 6 月 5 日上午 10 點,Apple 主題演講將在 apple.com 和 Apple Developer App 線上提供,為本次大會拉開序幕。你還可以通過同播共享,邀請朋友一起觀看。

現在,符合條件的開發者可以開始報名參加活動了。相關活動包括 Q&A、“會見演講者”以及社區暖場活動等線上聊天室活動,旨在促進你與開發者社區和 Apple 專家的溝通和交流。

Apple 公證服務更新

正如去年在 WWDC (簡體中文字幕) 上宣佈的那樣,如果你目前使用 altool 命令行工具或者 Xcode 13 或更早版本通過 Apple 公證服務對 Mac 軟件進行公證,則需要改為使用 notarytool 命令行工具,或者升級到 Xcode 14 或更高版本。自 2023 年 11 月 1 日起,Apple 公證服務將不再接受從 altool 或者 Xcode 13 或更早版本上傳的內容。已經過公證的現有軟件可以繼續正常工作。

Apple 公證服務是一個自動化系統,它會掃描 Mac 軟件中有沒有惡意內容,檢查有沒有代碼簽名問題,並快速返回結果。對軟件進行公證可向用户保證,Apple 已檢查且未發現軟件中包含惡意軟件。

為改進 Apple 平台的安全性和隱私保護,用於驗證 App 和關聯 App 內購買項目銷售的 App Store 收據簽名媒介證書將更新為使用 SHA-256 加密算法。此更新將分多個階段完成,新的 App 和 App 更新可能會受影響,具體取決於它們驗證收據的方式。

Apple 設計大獎入圍名單公佈

Apple 設計大獎旨在表彰在多元包容、樂趣橫生、出色互動、社會影響、視覺圖像,以及創新思維等類別中表現出色的 App 和遊戲。馬上一睹今年的入圍作品,我們將在太平洋夏令時間 6 月 5 日下午 6:30 揭曉獲獎者,敬請關注。

提案

通過的提案

SE-0399 value 包展開的元組 提案通過審查。該提案已在 二十九期週報 正在審查的提案模塊做了詳細介紹。

SE-0397 獨立聲明 Macros 提案通過審查。該提案已在 二十八期週報 正在審查的提案模塊做了詳細介紹。

SE-0392 自定義 Actor 執行器 提案通過審查。該提案已在 二十五期週報 正在審查的提案模塊做了詳細介紹。

SE-0390 引入 @noncopyable 提案通過審查。該提案已在 二十四期週報 正在審查的提案模塊做了詳細介紹。

Swift論壇

1) 討論從 Realm 數據庫遷移提示?

提問

目前正在尋求遷移到更輕量級的解決方案(realm 目前對我的用例來説太過分了)並且想遷移到 grdb,但不必將 realm 作為依賴項持續一年或更長時間......

回答

在沒有 Realm 庫的情況下,您是否能夠讀取 Realm 數據庫文件的內容? 否則,您必須將 Realm 作為依賴項保留,直到您的用户遷移完畢。

您可以通過發佈能夠要求用户升級的應用程序版本來縮短時間跨度。 這將允許您使用 “Realm-only”、“Realm-to-GRDB” 和最終的 “GRDB-only” 版本進行過渡。

2) 提議允許 protocol 嵌套在非通用上下文中

介紹

允許協議嵌套在非通用 struct/class/enum/actors 和函數中。

動機

將標稱類型嵌套在其他標稱類型中允許開發人員表達內部類型的自然範圍——例如,String.UTF8View 是嵌套在 struct String 中的 struct UTF8View,它的名稱清楚地傳達了它作為 UTF-8 代碼接口的用途 - 字符串值的單位。

但是,嵌套目前僅限於在其他 struct/class/enum/actors 中的 struct/class/enum/actors; 協議根本不能嵌套,因此必須始終是模塊中的頂級類型。 這很不幸,我們應該放寬此限制,以便開發人員可以表達自然作用於某些外部類型的協議。

建議的解決方案

我們將允許在非泛型 struct/class/enum/actors 中以及在不屬於泛型上下文的函數中嵌套協議。

例如,TableView.Delegate 自然是與表視圖相關的委託協議。 開發人員應該這樣聲明它——嵌套在他們的 TableView 類中:

class TableView {
  protocol Delegate: AnyObject {
    func tableView(_: TableView, didSelectRowAtIndex: Int)
  }
}

class DelegateConformer: TableView.Delegate {
  func tableView(_: TableView, didSelectRowAtIndex: Int) {
    // ...
  }
}

目前,開發人員採用複合名稱(例如 TableViewDelegate)來表達可以通過嵌套表達的相同自然範圍。

作為一個額外的好處,在 TableView 的上下文中,可以使用更短的名稱來引用嵌套協議委託(與所有其他嵌套類型一樣):

class TableView {
  weak var delegate: Delegate?
  
  protocol Delegate { /* ... */ }
}

協議也可以嵌套在非泛型函數和閉包中。 不可否認,這在某種程度上是有限的實用性,因為對此類協議的所有一致性也必須在同一功能內。 但是,也沒有理由人為地限制開發人員在函數中創建的模型的複雜性。 一些代碼庫(值得注意的是,Swift 編譯器本身)使用帶有嵌套類型的大型閉包,並且它們受益於使用協議的抽象。

func doSomething() {

   protocol Abstraction {
     associatedtype ResultType
     func requirement() -> ResultType
   }
   struct SomeConformance: Abstraction {
     func requirement() -> Int { ... }
   }
   struct AnotherConformance: Abstraction {
     func requirement() -> String { ... }
   }
   
   func impl<T: Abstraction>(_ input: T) -> T.ResultType {
     // ...
   }
   
   let _: Int = impl(SomeConformance())
   let _: String = impl(AnotherConformance())
}

3) 提議PermutableCollection 協議

簡介

該提案旨在添加一個 PermutableCollection 協議,該協議將位於集合協議層次結構中的 Collection 和 MutableCollection 之間。

動機

在某些情況下,人們希望能夠移動和排序元素,同時不允許(或限制)元素的突變。 鑑於大量不太重要的收集協議,這是一個值得注意的遺漏。 創建自定義集合類型時,PermutableCollection 協議在任何強制元素唯一性和/或身份的有序集合中都是首選。 用例將包括即將推出的 OrderedDictionary 和 OrderedSet。 對於不可變和可變集合,它還可以提供對 Swift 使用的底層(並且可能是高度優化的)排序算法的統一訪問。

設計

協議設計簡單,只需一個 swapAt 要求

/// A collection that supports sorting.
protocol PermutableCollection<Element> : Collection where Self.SubSequence : PermutableCollection {

  mutable func swapAt(_ i: Index, _ j: Index)
  
}

通過 swapAt 函數,通過擴展添加額外的排序函數實現。

extension PermutableCollection {

  mutating func move(fromOffsets source: IndexSet, toOffset destination: Int) {
    // move algorithm enacts changes via swapAt()
  }
    
  mutating func partition(by belongsInSecondPartition: (Element) throws -> Bool) rethrows -> Index {
    // partition algorithm enacts changes via swapAt()
  }
  
  mutating func sort() where Self: RandomAccessCollection, Self.Element: Comparable {
    // partition algorithm enacts changes via swapAt()
  }
  
  // ... more permutation operations that mimic those available for MutableCollection
  
}

4) 討論 Vapor 和 query 緩存?

5) 討論在 Swift 系統中,如何將文件內容讀取為字符串?

提問

我有一個文件的 FileDescriptor:

let fd = try FileDescriptor.open(<#filepath#>, .readOnly) 我可以使用 fd.read(into:) 將文件內容加載到 UnsafeMutableRawBufferPointer,但這是將文件內容加載到字符串中的正確第一步嗎? 如果是這樣,

在將它傳遞給 fd.read(into:) 之前,

  1. 我需要使用 .allocate(byteCount:alignment:) 分配 UnsafeMutableRawBufferPointer。 正確的 byteCount 取決於文件的大小。那麼如何使用 Swift System 獲取文件的大小呢?
  2. 如何從 UnsafeMutableRawBufferPointer 獲取字符串?

回答

可以參考這個Git庫:https://github.com/tayloraswift/swift-unidoc/blob/master/Sources/System/FileDescriptor.swift

6) 討論為什麼我不能使用 @dynamicMemberLookup 轉發 enum cases?

7) 討論如何在 swift-foundation 中正確地進行性能測試?

提問

我想對比一下swift-foundation 和 Xcode 自帶的 JSONDecoder 解碼的速度。

我在一個新項目中使用單元測試和 measureBlock 以及在 swift-foundation 中使用 JSONEncoderTests 對其進行了測試。

swift-foundation 中的 JSONDecoder 看起來太慢了,我認為這是因為 swift-foundation 還沒有作為一個庫被引入。

推薦博文

iOS crash 報告分析系列 - 看懂 crash 報告的內容

摘要: 本篇文章主要介紹了iOS崩潰報告的解讀方法,從報告的 Header、Exception information、Diagnostic messages、Backtraces、Thread state 和 Binary images 六個部分詳細講解了各字段含義,並提供示例代碼幫助讀者更好地理解。同時也引導讀者去深入學習符號化的相關知識來獲得更多信息。通過閲讀本文,開發者可輕鬆看懂代碼中產生的崩潰報告,並進行問題定位和處理。

SwiftUI 中 LinearGradient的用法

摘要: 這篇博文探討了在 SwiftUI 中使用 LinearGradient 為對象創建漸變顏色效果。它展示瞭如何定義顏色數組、使用標準和自定義起點和終點,以及設置座標以改進鉛筆對象上的顏色筆尖。本文還包括用於創建具有各種起點終點組合的不同線性漸變的示例代碼。文章以示例結束,展示瞭如何使用這些技術來自定義一支藍色鉛筆或整套鉛筆的外觀。

Swift 中的動態成員查找

摘要: 本文介紹了 Swift 語言中的動態成員查找(Dynamic Member Lookup)特性。通過在類型上使用 @dynamicMemberLookup 屬性,我們可以重載該類型的 subscript 方法來更方便地訪問其數據。但是,這也意味着缺乏編譯時安全性。為了解決這個問題,本文提到了使用 KeyPath 作為參數的 subscript 方法來實現編譯時安全檢查。最後,作者建議我們可以謹慎地使用 @dynamicMemberLookup 特性來改進 API 設計。

話題討論

有博主在視頻社交平台説,2023年已然迎來了經濟危機,只是有些人不願意相信而已,那麼你認為國內2023年是否真的進入了經濟危機?

1.是的。確實已經經濟危機了,今年工作很難找,同事比以前更卷啦,各種裁員消息不斷。

2.經濟危機不可能。五一淄博接待遊客超過了100萬人次,人擠人的旅遊景象依然常在。

3.經濟危機應該是相對的。對於大多數上班族來説,2023年很難,奉勸大家且行且珍惜。

關於我們

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

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

user avatar xiaoyuindebuilder Avatar xingzoudedahuoji Avatar waylau521 Avatar
Favorites 3 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.