

Discover more from 波報 | Pofat 的 Swift 中文電子報
💬 Pofat 的話
這週有一個非常重要的 SE 開始審查,這個提案通過後會為目前使用 Swift 的心智模型帶來巨大改變,值得先了解一下。另一件重要的事就是關於非產品開發工作的「清道夫生存指南」專欄順利開始,目前「計畫」每隔週的週三早上發行,內容將包括鉅細靡遺的性能工作內容,還有如何進攻、防守與建立團隊等,從規畫到執行細節都有。我相信這個專欄的內容很實用且在網路上是找不太到的資源,不過我不打算用付費牆保護這些文章,若是內容有幫助到你、或是想看更豐富的內容, 請訂閱我的 Patreon 支持我、按下 ❤️ 和 💬 留言討論,討論後又可以再多生幾篇內容,所以來吧!
🌎 On Swift Community
Xcode 14.3 允許你自定義 back deploy
SE-0376 的改進在 Xcode 14.3 降落,你可以把新版本引起的功能往前支援更之前的作業系統版本。


The Composable Architecture - Best Practices
做出 Arc 的 The Browser Company 是 TCA 的大型導入者之一,文內有很多實用的技巧和誤用的坑,比如不要用 action 來啟動共享的邏輯,使用 scope
時要留意性能問題,用過或想用 TCA 的千萬別錯過。


@State 注入機制造成的靈異現象
說到坑不能不提 SwiftUI,SO 有個老問題,這篇文章很有意思,一步一步探討其成因、@State
的注入機制與解決辦法,我最喜歡這種通靈文學惹。其實說穿就是 SwiftUI 為了最佳化, body
裡如果沒有使用到( lazy load 的畫面如 .sheet
等不會)@State
,就算其值變化了也不會更新畫面。
🗣️ On Swift Forum
SE-0390: @noncopyable
structs and enums (Reviewing)
我們熟悉的 Swift 值類型其實是值語義類型,使用者使用起來像值,底下則有 copy-on-write 的行為在修改時發生,同時這過程也有存取的限制,以免發生預期外行為,這些要求在最小性能花費的環境中都是想砍掉的開銷。
做為 Swift Ownership 道路上重要的基礎之一便是提供沒有 copy-on-write 的基本型別,SE-0390 則提案了 non copyable struct 與 enum 的語法、用法與限制,尤其是用法會為大家對值類型的心智模型帶來巨大變革,想必這功能在正式版出現後會有一堆網路教學文章出現。
宣告方式只要加上 @noncopyable
即可,若有 stored property 或 associated value 這些需要存儲空間的相關值也必須要是 @noncopyable
,使用泛型參數只要不違背這原則也是可以的。
目前不允許把 @noncopyable
做為泛型參數的型別,實務上指它們
不能遵循 protocol ,因為
some P
與any P
都預設內容物是 copyable。唯一的例外是Sendable
,因為這 protocol 是特例,在編譯後型別不會留下遵循的紀錄,這裡最大的好處是為@noncopyable
開啟了 concurrency 的大門不能做為 protocol 裡的 associatedtype;也不能當錯泛型型別或函數的參數
不能強轉為
Any
(它是個 protocol)或其它存在容器不能透過 reflection 在 runtime 存取
不能使用於 tuple 中
不能複製的值類型其實可以把它的存在視做引用類型,所以它可以擁有 deinit
🤩,不過 consuming
方法(下面解釋)執行後因為就會銷毀,這情況下便不會觸發 deinit,要特別留意
。
對於上述的限制已經感到麻煩了嗎?還沒完,使用上還有更多要考慮的情況,這裡僅挑重點說。首先要理解 consume
與 borrow
這兩種操作,執行consume
操作後原本的值就會失效,也就是該實例的所有權被轉移出去,比如賦予變數值的 =
就是 consume
;
borrow
則沒有交出所有權,而是借別人共享,因此正常下借物者不能修改其值,也不能 consume
借來的值(這樣就是修改了所有權),但可以再無限地借出去。
原本的 copyable 與 @noncopyable
在這兩種操作又有不同,對使用者來說幾乎感受不到 copyable 在不同操作下的差異,因為編譯器會私底下複製一份出來讓別人 borrow
;
而 @noncopyable
在 consume
之後就失效了,不能再 borrow
出去,同理會鎖定存取的 inout
也會有一樣的限制。
其它還有許多不同場景下的探討,比如引用類型或 escaping closure 裡,細節可以參考內文,上面的原理和操作若能理解想必也不難推論。
除了標記的用法,也曾討論是是否用 Copyable
與 NonCopyable
的 protocol 方案,但是大多類型仍然是預設 Copyable
的行為,所以這只是備案。未來還有幾個重要的努力方向,一是加強泛型參型的支援,比如 Optional
與 Result
這種容器類型自動變 @noncopyable
,只要裡面包的型別也是;二來是是更細膩的解構子,讓你在 self 失效前轉移或修改 properties 裡的其它 @noncopyable
。
🤪 Pofat 選推
旅行良伴


放心停吧、這裡很安全。他們說
生產力的祕密