💬 Pofat 的話
本周好多開始審核的 Evolution,論壇上也很熱鬧,加上很有衝擊性的 PR 草稿,Swift 正轟轟轟地往第六代衝刺啦!
🌎 On Swift Community
Server Guides Now on Swift.org
The Swift Server Workgroup 維護了一份以 Swift 開發 Server Side 的文件集,包含環境架設、測試、效能分析與部署等各環節,現在這份文件集已經併入 Swift.org,算是官方正式把它列為主體之一的實際作為。
TCA Action 的邊界
我個人一直認為掌握邊界是在程式開發很重要的軟實力之一,在合適的地方畫清界線,可以省下不少未來的困擾。
TCA 裡用來改變 state 的 Action 是 enum ,enum - case 間本身缺乏邊界性的設計,比如你很容易會不小心使用到 default:
來冷處理你不在意的 action ,但一旦用上了會讓編譯器失去提醒你有新 case 要處理的能力,Krzysztof Zabłocki 的這篇文章說明了三種不同的 action 範圍以及如何設計和運用它們。
如何在 SwiftUI 上共用跨平台的程式碼
雖然 SwiftUI 平身很多元件是可跨平台使用,但一些週邊邏輯仍可能是有平台差異,利用 typealias 和 extension 的小技巧讓你保持呼叫方的簡潔,就像呼叫 SwiftUI 那些跨平台元件一樣。
🗣️ On Swift Forum
SE-0366: Move Operation + “Use After Move” Diagnostic (Returned for Revision)
Ownership 實現的一環,move
變數給別人後自己就不能再用了,目前大多認為 move
這個名字不足以清楚地表達其用途以及需要考慮和其它 ownership roadmap 裡功能的互動情況,因此將重新再審視。
SE-0367: Conditional compilation for attributes (Accepted)
之前好像漏看了這個提案,不過接受後再來了解正是好時機!當用 compiler 版本 (#if compiler(>=5.6)
)來管理是否可以使用某個編譯標記有兩個缺點:
會有重複的程式碼(同一個宣告在 if 和 else 要各寫一次)
版本未必準確,比如 development 版本
因此採用更明確的語意來包住標記:
SE-0368: StaticBigInt (Reviewing)
你可能知道想要以 let value = 100
這種方式來建立一個新實例需要 ExpressibleByIntegerLiteral
這個 Protocol 的幫忙,但你知道等號右邊並不是什麼樣的整數都可以放嗎?
起因在於關鍵的 init(integerLiteral:)
只能接受 standard library 裡有的型別(最大到 UInt64
),因此就算你想要實做了 UInt256
,在等號的右邊最多也只能放到 UInt64
的最大值而已。
因此我們需要一個可以表達任意大小整數的新型別給 ExpressibleByIntegerLiteral
用,也就是 StaticBigInt,並且把它加入 standard library 裡。
SE-0369: Add CustomDebugStringConvertible conformance to AnyKeyPath (Reviewing)
直接印 (print)出 KeyPath 的話會發現目前結果有所屬物件的型別資訊,也有回傳的物件型別 (Swift.KeyPath<Theme, Color>
),卻沒有這個 KeyPath 本身名稱的資訊,理想上是 \Theme.backgroundColor
,不然無法與其它同型別的 path 做區別。
因此這個 PR 主要就是做 extension AnyKeyPath: CustomDebugStringConvertible
,利用 metadata 拿出該變數的名稱再組合字串印出。大多內容是 Swift ,有興趣的話是個適合做為入門讀物的 PR。
SE-0370: Pointer family initialization improvements and better buffer slices (Reviewing)
一連串針對 UnsafeMutablePointer
API 的新增與改善。
SE-0371: Isolated synchronous deinit (Reviewing)
@MainActor
class 的 deinit 如果動到了不是 Sendable 的型別會被編譯器警告,因為可能有race condition,為此使用者需要為這些型別的存取另外再多做一些方法(比如 close()
),顯得多餘。而這個提案直接讓 deinit 對這些類型的存取變得可行,因此大大地改善了易用性。
How to disable implicit Foundation imports?
SPM 中有個 bug 會意外地幫你引入 Foundation
,當你在 package 裡指定 resource ,SPM 會生成一個檔案並透過 Bundle
來存取這些資源,但這是定義在 Foundation
裡的型別,因此就一起被加進去了。
🎉 Swift Commits
@_objcImplementation
Apple 全面 Swift 化的野心逐一嶄露,這個仍是草稿的 PR 便是其中之一, Swift extension 裡的實作加上 @_objcImplementation
便可以取代 Objective-C 的 @implementation
實作。在上半年 Foundation 引入 Swift 後可以讓部分元件以 Swift 實作,但可能仍能需要一個 Objective-C 的實作來呼叫,有了這個標記後只要留下宣告 @interface 的 header 就好,連實作的部分都可全面 Swift 化,實為 OC 皮 Swift 骨。
🤪 Pofat 選推
聽 Swift Chart 在唱歌 (利用 VoiceOver 的功能)
Mark 真壞,怎麼一直偷看人家訊息
歷史小故事: Janet Jackson 的 Rhythm Nation 竟然有遠程使當腦當機的能力!?最後發現原因是內含引起硬碟共振的頻率,只是天網來襲時恐怕不能用這招了(終結者應該都是 SSD 了吧?)
這團體技好華麗啊!