波報 | Pofat 的 Swift 中文電子報

Share this post

波報 #35 - 清道夫生存指南

pofat.substack.com

波報 #35 - 清道夫生存指南

Swift 大小事 2023/2/20 - 2023/2/26

Pofat
Feb 26
1
Share this post

波報 #35 - 清道夫生存指南

pofat.substack.com

💬 Pofat 的話

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

《看前一期 | 所有文章》


🌎 On Swift Community

Xcode 14.3 允許你自定義 back deploy

SE-0376 的改進在 Xcode 14.3 降落,你可以把新版本引起的功能往前支援更之前的作業系統版本。

Twitter avatar for @0xA1EC
Alec O’Connor 🍊 @0xA1EC
Xcode 14.3 has a game changing improvement, frameworks like SwiftUI can now mark improvements as backwards compatible 🤯
Image
11:45 AM ∙ Feb 22, 2023
174Likes31Retweets

The Composable Architecture - Best Practices

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

Twitter avatar for @merowing_
Krzysztof Zabłocki @merowing_
📚New Free Article: Best Practices for @PointFree TCA projects we use at @browsercompany merowing.info/the-composable…
merowing.infoThe Composable Architecture - Best PracticesSet of best practices for The Composable Architecture projects based on experiences of the team at The Browser Company.
12:09 PM ∙ Feb 22, 2023
97Likes20Retweets

@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 選推

旅行良伴

Twitter avatar for @XboxP3
Phil Spencer @XboxP3
I love traveling with my Series S and my @UPspecGaming xscreen and ending a day with some @hifiRush.
Xbox Series S with xscreen attached with hi fi rush on the screen.
5:20 PM ∙ Feb 21, 2023
16,841Likes993Retweets

放心停吧、這裡很安全。他們說

Twitter avatar for @pikuma
pikuma @pikuma
Image
1:36 AM ∙ Feb 26, 2023
125Likes9Retweets

生產力的祕密

Twitter avatar for @nixcraft
nixCraft 🐧 @nixcraft
lol
Image
2:41 PM ∙ Feb 25, 2023
2,354Likes249Retweets
Share this post

波報 #35 - 清道夫生存指南

pofat.substack.com
Comments
TopNewCommunity

No posts

Ready for more?

© 2023 Pofat
Privacy ∙ Terms ∙ Collection notice
Start WritingGet the app
Substack is the home for great writing