💬 Pofat 的話
這週有不少技術話題,本期內容適合大家在開工逃避工作時閱讀。
🌎 On Swift Community
Order Matters
我很喜歡的 Emerge Tools 又有新文章,非常精彩。
如果你的程式碼有 dynamic cast 成 protocol 的片段,這段在運行時執行起來可不便宜,無法在編譯時期確定類型的代價不會消失,是移到了運行時做遵循的檢查,iOS 16 把這個工作移到 app launch 前期一次做完並緩存。最近這段原始碼公開,Emerge Tools 立刻做了解讀並且點了出加速的方向:排序 binary file 以滅少 page fault。
Page fault 花的時間在 iPhone 6 上大概是平均一個 page load 要 0.3 ms(經驗法則),把需要檢查的片段提到前面擺一起就能有效減少 page fault。這個技巧並非新招,原本就一直是用來加速啟動的手法,老招依然好用。
Point-Free 五週年啦
Weak self 介紹多次同時也惠我良多的 Point-Free 五週年,二月一號本週三將會有首次的直播活動,還有 Discord 頻道可以加入。
SwiftUI 心得
別人的心得和我的心得,不過若只是想快速做個 PoC 或開始一個小 app,SwiftUI 能讓你減少很多猶豫。
A Lightweight Cross-Platform SwiftUI Approach
SwiftUI 的一碼多平台其實沒那麼美好,絕大多時候你需要針對不同平台做處理,與其到處寫不同平台的 if 判斷分支,這裡有個不錯的想法,利用 typealias 把不同平台的同樣角色都指向同一個名稱,簡單說就是把 UI- 和 NS- 都轉成 OS-。
🗣️ On Swift Forum
SE-0384: Importing Forward Declared Objective-C Interfaces and Protocols (Accepted)
一個我先前漏掉的重要提案,Forward Declaration 是 ObjC 裡常用來避免 import cycle 或在背後施展黑魔法的技巧,其原理是告訴 compiler 這裡有個 class 或 protocol 叫 XXX,你就用不要問那麼多。
而因為 Swift 看不到這種宣告因而變成轉換或交互使用上的一大障礙,這裡的做法是在 Swift context 裡注入其對應 class 或 protocol 的空白宣告,其中 class 假設是 NSObject 以及 protocol 則預設為 NSObjectProtocol,為了以最小的努力讓「Swift 能使用 ObjC 的 Forward Declaration 」,注入同時也加入了 @unavialable
的標記以免使用者不小心繼承了這些「只能相信它存在」的類型。
有了這個功能便可以在 Swift 中把 Forward Declaration 當成參數、回傳值或直接建立實例,在匯入擁有宣告的 module 時也能使用該類型的所有公開介面。此 SE 並不是完整的解決方案,因為 REPL 的環境中沒有開啟,不過它已克服了最頭痛的第一道關卡:編譯。
SE-0386: package
access modifier (Reviewing)
SPM 逐漸成熟,如今已具有成為大大簡化管理流程的模組管理工具之潛力,而當 package 越來越多後,原本的 access control 種類不足的問題也浮現出來。
簡而言之,目前沒有「在同一個 package 不同 module 存取,但不對 package 以外開放」的控制選項,這個提案就是加入了新的存取範圍與標記:package
解決這個需求。
Why is UnsafeBufferPointer
’s baseAddress
optional?
為什麼 Swift 取用 C 指標 API 中的 baseAddress 有可能是 nil?這其實和 C API 回傳的結果有關。
What is the correct way to observe the changes from within a nested ObservableObject
?
巢狀的 ObservableObject 其子物件的變化無法在最上層被捕捉到,這裡提供了一些不是那麼完美,但可用的解法。
🤪 Pofat 選推
上週突襲上架、好評不斷的 Hi-Fi Rush 可以摸貓,買了
上週釋出的 Forspoken 可以摸貓,買了
好,也買了 (?
View 還是 UI 的好(見上面 SwiftUI 心得)
差點笑死
最後來個猜謎,單看動畫效果你認得出 Flutter、React Native 與 SwiftUI 嗎? (解答在此)