你好,這是波報
謝謝你訂閱波報,身為一個在蘋果生態系打滾多年的 App 工程師,長久以來我的思維都是「球來就打,糞擋就挖」,著眼於問題解決可說是目前的職業生涯寫照,然而我心裡一直渴望對「工作的表層之下」有更多了解,對 iOS App 開發者來說大概就是 Swift 或各種框架、工具的演進思維。受到 13 的 Apple 開發者週報 和 曼報 的啟發,波報是我用來探索的手段,也希望能為中文開發圈注入多一點不同面向的資訊。
預計波報每周會有 1 期,希望都是五分鐘內能看完的內容,內容包含但不限於:
Swift 和 LLVM 官方消息
Swift 和 LLVM 論壇新鮮事
Swift (或其它相關)的底層原理探討
個人的近期學習或思考
2022 Swift 學徒計畫將啟動
對於想開發 Swift 卻不得其門而入的人來說,學徒計畫 (The Swift Mentorship Program) 是個很好的入門管道,這個計畫會依對不同領域的與趣分配有經驗的開發者做為直接的導師(Mentor),展開為期 12 週的指導,我自己都很想參加,去年沒上😢。6 月 1 號開放表單報名,27 號宣佈分配結果,更多詳情和時程可見官網說明。
去年的參加經驗可見這位 iOS 工程師的分享文,過程中修了 Property Wrapper 的 bug 以及添加新功能:


你最深刻的 Swift 功能是?
論壇有人啟動調查,其中 Argument Label 獲得最多迴響,因為很快就能明白每個變數為什麼傳進來。我個人喜愛的是 - 函數乃一等公民(function as first class citizen)這個性質, 如此一來能方便組合商業邏輯,因而 App 邏輯能更輕易地規模化,常見的例子就是透過 KeyPath 來過濾 Array 裡的元素:
let filtered = fooArray.filter(\.isBar)
問愛當然也有問恨的,有趣的是也有人提到恨 Argument Label 無法在 stored closure 使用,看來人氣王地位確定了啊!
Regex Literal
最近 Swift 動得很厲害的兩大功能當屬 String Processing 與 Regex Parser ,前者為了WWDC瘋狂趕工,後者最近陸續透過 Evolution 慢慢搞,這樣大家知道優先性了吧😏
總之 SE-350 定義了一個新型別 Regex
,做為更方便建立的手段,SE-354 則在規畫 Regex literal 的用法,目前還在二次 review 中,等到定案再來詳細看看,目前暫定是用慣例,即一對 /
包住的語法,比如:
let regex1 = /([ab])?/
如此一來不久之後我們就能寫出下面這種 code 了呢 🌚
let _: _ = /__/
🧐 TWIL…
這裡的 TWIL 是 This Week I Learned
在 SwiftUI view 裡不能 lazy
Don't use escaping closures in SwiftUI 裡提到一個會出問題的有趣寫法(雖然我自己不會這樣寫),把生 view 的 closure 存起來,等到 body
被呼叫時才 lazy 展開,如下:
struct Collapsable<Content: View>: View {
@State var collapsed: Bool = true
let content: () -> Content
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
}
var body: some View {
VStack {
if !collapsed {
content() // <--- Expand when body is called
}
Button(collapsed ? "↓ open" : "↑ close") {
visible.toggle()
}
}
}
}
這樣做有可能 Content
還沒生成,而你已經改動 Content
裡的資料,比如 @State
,等到初次顯示時它就仍還是初始值。
這樣寫的背後動機能理解為常見的可 lazy 就 lazy ,只是 SwiftUI 裡 UI 的運作模式分成「建樹」和「繪製」兩個階段,後者才會根據樹狀結構分析的結果依需求去呼叫 body
來更新畫面,因此盡量不要在繪製階段才變動 UI 結構(比如初次展開),會有驚喜。
已经订阅。顺便抓个小虫 Ragex -> Regex。