💬 Pofat 的話
上期提過了三月底的 visionOS 研討會 Let’s visionOS ,還沒決定動身的讀者們不妨看看 Chao Code 的 Jane 錄的介紹影片。
🌎 On Swift Community
有些工程師的 Y2K 還沒過去啊
我這一代的工程師應該都對 Y2K 危機耳熟能詳(沒聽過的就是年輕人啊),這是個程式中的日期處理問題,在 90 年代時很多都只用西元後兩位來表示年份,因此當 2000 年來臨時,無法區分是 2000 年還是 1900 年,進而可能引發資訊設備的末日。當時的娛樂圈也沒有放過這個機會,從資訊到現實的末日都有相應的電影推出,並在 1999 年底推出,分別是史恩康納萊主演的《將計就計》、與阿諾的《魔鬼末日》,年幼的我當時認真地懷疑自己是否撐得到 2000 年。
雖然最後在政府與資訊界的努力下平安地度過 2000 年,但我們仍然沒有從 Y2K 危機中解除啊,上週四 2/29 除了《FF VII - Rebrith》發行與大谷讓世界千萬粉絲心碎外,很多資訊系統也默默地當機了。
紐西蘭的自助加油站無法接受付款,因為程式無法處理 2/29
巴黎的路燈在 2/29 那天的午夜直接熄燈(物理)
https://euro.dayfr.com/sports/1822986.html
更古老的案例是日本部分舊手機只支援到 2019 年的日曆,到 2020 年直接當機
https://twitter.com/zzzsuzuyasu/status/1212029604069691393
這裡有 2/29 那天的自爆清單,有興趣的可以去笑一下
https://codeofmatt.com/list-of-2024-leap-day-bugs/
我個人是認為都 2024 年了,不要再自幹 time library,用標準程式庫的好嗎?
可以考慮的第三方之一是在 2/29 當天宣佈 1.0 版正式發佈的 Time,由具有豐富時間經驗的 Dave Delong 經過四年打磨(在四年前的 2/29 亮相)而成:
https://forums.swift.org/t/announcing-time-1-0-0-type-safe-calendar-calculations/70366
An Introduction to Isolation in Swift
Swift 6 最重要的里程碑就是 Swift Concurrency 的完備,不過其用法和規範已發展到「無法一看就懂」的地步,尤其是 isolation 這個概念,這篇文章是我最近看過解釋最清楚的,同時也指出了 SwiftUI 定義 isolation 方式(在 var body
上而不在 View
protocol 上)的潛在問題。
另一個 isolation 的混亂問題是 DispatchQueue.main.async
後接的 closure 會自動被加上 @MainActor
,所以你可以在裡面無痛呼叫其它由 @MainActor
隔離的方法,不過這實是由 compiler 有點過於簡單粗暴的 syntax check 完成,如果你用了 typealias
或定義同名的 DispatchQueue.main.async
,你將不會獲得這個特性,雖然不常見但遇到了你可能會在這隱晦迷宮裡轉不出去,詳見 Ole 的文章: https://oleb.net/2024/dispatchqueue-mainactor/
如何在 SwiftUI 中取得 Child View - VariadicView
SwiftUI 表達式的語法雖然寫來爽快直觀(直到實機上擺了你一道),卻也增加了不少限制和黑箱。SwiftUI 的 API 基本上落實了 local reasoning 的原則,就在當前 scope 設定,於是乎你幾乎不可能由正式管道取得 child view 本身,也就是在 iOS 16 提供 Layout 前你無法實做 HStack 或 VStack,就算透過 Layout 也無法取得這些 View 的內含資訊,只能取得其大小位置,並決定怎麼擺放它們。實做 Group 這樣能群組 view 但又不是如 Stack 把 children view 融合成一個 view 的容器是做不到的。
SwiftUI 中有個 _VariadicView
,直接被 HStack 所使用的底層元件,而且會透過 @inlineable 讓開發者們看到,所以是不太容易被拔掉的「相對安全」private API,善用這個元件你可以做出更多元的容器元件,不只是改變大小 layout 還可以針對不同的元件套上屬性,比如第一個 child view 加紅框、第二個加藍框,詳見 Moving Parts 的教學文;而另一個實用的方法是「取得 child view」,Emerge Tools 利用這個特性完成了基於 preview 的 SwiftUI snapshot test - SnapshotPreview。
https://www.emergetools.com/blog/posts/how-to-use-variadic-view?s=1
透過 _VariadicView
的家族成員們可以取得 view tree 的結構與成員,這點非常實用,也許能做出類似 chisel 這樣方便直接修改 UIKit 屬性的工具。
🗣️ On Swift Forum
[Pitch] Speed up protocol conformance checks on first launch using bloom filters
swift_conformsToProtocol
是 app 啟動時最花時間的工作之一(如果你有 Swift protocol),因為 Swift runtime 會線性搜索所有 confromance ,在需要建立 metadata 時。iOS 16 把這個結果在 dyld 的 closure 預執行並放入 cache 裡,但 app 更新後使用者仍然有機會體驗到這個緩慢的啟動過程。
有人便提出了使用 bloom filter (一種快速檢查某元素是否屬於某集合的資料結構)來加速這個流程,不過這牽扯到 linker 需要為之調整,以及可能對某些情形幫助不大(如一個 protocol 有大量 conformance)。
🤪 Pofat 選推
完美說明 async 的染色力
開發商對 Apple Arcade 不確定性的未來感到憂心忡忡,Netflix 是最大的對手之一,當然 Apple 出了名地難搞也正在加速惡化他們與開發者的關係: