波報 #59 - 久 bug 成 feature
Swift 大小事 2023/8/28 - 2023/9/3
💬 Pofat 的話
iPhone 15 的錢準備好了嗎?只剩不到一個月啦!
🌎 On Swift Community
Apple 秋季發表會
台灣時間 9/13 凌晨一點,這個主視覺讓我想到電影「沙丘」,是否跟新的 Apple Watch Ultra 有關?
https://www.apple.com/tw/apple-events/
NSString 不包含空字串
有個萬年老坑最近又浮上討論串,長相如下:"asdf".contains("") // true
import Foundation
"asdf".contains("") // false
這個問題的根源在於當引入 Foundation 時,Swift String 會自動轉換為 NSString,因此第二個 contains(_:)
調用的是 NSString
的方法,而第一個則是調用 Swift.String
的方法。然而,NSString 的行為卻不正確,這個問題在七年前的論壇上已經有了相關的討論。俗話說得好,久 bug 成 feature ,雖然這個檢查應該不常用,但還請大家多小心。
(看到 7 years later 還是有點震憾)
1Password 開源支援 passkey 的 library
1Password 目前的beta 版開始支援 passkey 登入網頁,他們也開源了 passkey-rs (Rust, of course😜)讓開發者也可以用來支援 passkey,詳情參閱介紹文。
🗣️ On Swift Forum
Embedded Swift
嵌入式系統仍然很流行,但它也能 Swift 嗎?
要在資源非常有限的環境上運行,Swift 最大的挑戰就是 binary size 與 memory usage,在程式本身邏輯外,除了 runtime 與 standard library ,最大的 binary 佔用來源大多是 metadata,任何 runtime 相關的功能都需要仰賴它,維護這些類型資訊表格非常佔空間; 另一個挑戰則是面對系統有限的 runtime dependencies。
這些特性與一般的手機和桌面開發有很大的不同,因此需要引入一種新的編譯模式來滿足這些需求,這種編譯模式的目標是:
強力瘦身,至少 runtime 和 standard library 不能主宰應用程式的最終大小
簡化編譯輸出
更有效的無用程式碼刪剪
不論是否有heap,都應該能夠支援(在不支援的情況下將無法使用class)
盡可能地移除 runtime call,比如你無法 dynamic casting,但部分情況(如引用計數)可允許
生成最小靜態連結的 binary (全部靜態連結才能有效地進行尺寸的最佳化)
要刪除這麼多功能的情況下,Swift 全功能支援自然不實際,所以 Embeded Swift 會是一個 Swift 的子集,不管 ABI 穩定性,不支援橋接 ObjC,runtime 功能大幅刪除,String API 與 unicode 相關的會被割到另外的地方去。最大影響的應該是 print()
不能直接用來印一個物件(叫人怎麼 debug!?),但會有替代形式出現,最新的 any
existentail 也不支援。
然而這領域中,大多數標準庫功能已經能夠顯著提升開發體驗,例如,要處理連續的binary 數據,可以使用 Sequence 來自定義迭代方式,或者可以直接使用map、reduce等功能,想必會讓開發更加愉快
目前已有真的可以動的 PoC,詳見論壇文章,完整的技術目標和執行方向可以看願景文章。
[SE-0407] Member Macro Conformances (Reviewing)
SE-0389 可以讓你宣告能直接遵循 protocol 的 macros,SE-0402 可以支援 帶有 where 的遵循,不過上述都是用 extension
的形式,而有些遵循必須在最原始宣告的地方進行(比如 Encodable
), SE-0407 則滿足了這個需求
protocol DefaultInit {
init()
}
@attached(extension, conformances: DefaultInit)
@attached(member, conformances: DefaultInit, names: named(init()))
macro DefaultInit() = #externalMacro(module: "MacroDefinition", type: "RequiredDefaultInitMacro")
@DefaultInit
class C { } // 會變成 class C: DefaultInit { required init() {...} }
🤪 Pofat 選推
如果你發現你大多時間都在處理團隊事務,且內心也不確定這是不是正途的話,Being Glue 這篇文章能幫你從更高階的觀點思考 (文長注意)
RTO(回到辦公室)是為了成為夜景啊 🥲
https://mastodon.social/@krzyzanowskim/110971740824689308
想玩 visionOS 上的彈幕遊戲 (我覺得享受孤獨會是 visionOS 上最適合的應用)