[Swift 深入解析 #9] Swift ABI 穩定性:2019 年 App 容量縮小的原因
2019 年 Swift 5 與 iOS 12.2 發布後,App 容量縮小是 ABI 穩定性帶來的結果。本文整理 Swift 執行階段從每個 App 搭載移至 OS 的過程,以及模組穩定性與 @frozen 的取捨。
閱讀文章精選主題 · 73 篇文章
從基礎原理到實務取捨,系統化瀏覽 Swift 文章。
最新文章
2019 年 Swift 5 與 iOS 12.2 發布後,App 容量縮小是 ABI 穩定性帶來的結果。本文整理 Swift 執行階段從每個 App 搭載移至 OS 的過程,以及模組穩定性與 @frozen 的取捨。
閱讀文章檔案控制代碼或鎖這類只有唯一一份才有意義的資源,不應該被複製。本篇整理如何用 Swift 5.9 的 ~Copyable 將禁止複製刻進型別,以及 borrowing、consuming、inout 三種傳遞方式與適用時機。
閱讀文章Swift 5.9 的巨集是嵌入編譯器的程式碼產生外掛。本篇整理接收語法樹並回傳程式碼的原理、freestanding(#) 與 attached(@) 兩大類,以及自行建立時必須付出的成本。
閱讀文章struct 大小不是屬性大小的單純總和。本篇整理 size、stride、alignment、填充、利用 extra inhabitant 的 Optional,以及 64 位元 existential container 的實測結果。
閱讀文章方法呼叫會編譯為直接呼叫、vtable 或 objc_msgSend。本文整理 final 與 private 提升效能的機制、協定 extension 的陷阱,以及如何透過分析工具驗證。
閱讀文章結構化並行處理回答了誰要負責非同步工作的結束。本文整理子工作無法離開父層範圍的原理、取消訊號的傳播方式,以及使用 Task.detached 時必須手動補回的保證。
閱讀文章啟用 Swift 6 模式後,大量並行處理錯誤會湧現,而主角通常是 Sendable。本篇整理這個協定的意義:值能否跨越隔離邊界,以及依序採用值型別、不可變化、升級為 actor 的遷移處方。
閱讀文章Delegate 與 Closure 都能處理相同的回呼需求,但特性不同。本文以相同範例並列實作,整理出五項實際差異,以及依事件數量、關係存續時間與是否需要回傳值來選擇的判準。
閱讀文章actor 是能保護自身狀態的第四種型別。本篇整理如何將並行存取排隊,讓編譯器捕捉資料競爭,以及最知名的陷阱:再進入(reentrancy)。
閱讀文章await 暫停的不是執行緒,而是函式。本文整理 suspension 的真正意義:函式將狀態儲存在堆積,並把執行緒歸還給協作式執行緒池,以及為什麼循序 await 不是平行執行。
閱讀文章Factory 是能在編譯時抓出相依性註冊遺漏的 Swift DI 函式庫。本篇以 2026 年 7 月的 3.3.1 為基準,整理基本用法、Scope 宣告、測試與預覽注入,以及和 Swinject 的差異。
閱讀文章協定導向程式設計(POP)不是依據型別繼承了什麼,而是依據型別能做什麼來設計。本文以Swift範例整理繼承的限制、透過協定組合解決的方法,以及應避免使用的情境。
閱讀文章\.name 不是 map 的縮寫語法,而是獨立型別 KeyPath 的值。本文整理將屬性存取轉成值的意義、唯讀、值型別寫入與參考型別寫入三個層級,以及實務上的應用場景。
閱讀文章屬性包裝器不是 SwiftUI 語法,而是 Swift 5.1 透過 SE-0258 引入的語言功能。本文整理編譯器如何翻譯 @Clamped、wrappedValue 與 projectedValue($) 的真相,以及避免濫用的界線。
閱讀文章從 Codable 自動合成實際產生的內容,到實務必遇到的鍵名不一致、日期格式、巢狀結構、部分失敗四種情境的標準解法,以及 DecodingError 偵錯,一次整理。
閱讀文章map·filter·compactMap·flatMap·reduce 五個函式的區別,在於閉包回傳的內容。本篇整理與 for 迴圈的選擇標準、鏈式呼叫產生的中間陣列,以及 lazy 序列所解決的問題。
閱讀文章Swift 5.5 以上可將測試函式宣告為 async,使用 await 等待結果後驗證。本文也整理錯誤驗證、舊式回呼 API 測試,以及仍須使用 expectation 的情況。
閱讀文章關聯型別(associatedtype)是協定中預留的型別空白。本文整理著名 generic constraint 錯誤的原因、SE-0309 與 SE-0346 如何解除限制,以及 primary associated types 的使用方式。
閱讀文章查看 Swift 5.6 之後的程式碼,會看到協定名稱前面加上 some 或 any:some View、any Error、some Collection。以前可以直接把協定名稱放在型別位置,但現在編譯器會警告或報錯,要求加上 any。…
閱讀文章第一次在 Swift 程式碼中遇到角括號 <T> 時,視線會停頓一下。函式名稱旁多了一個大寫字母,打開文件後,還會看到 func map<T>( transform: (Element) -> T) -> [T] 這類簽章。泛型是 Swift 中階的入門關卡…
閱讀文章在〈閉包〉一文中,我們介紹了如何透過 [weak self] 打破循環參照,但還留下了一個問題:除了 weak 之外還有 unowned,它們有什麼不同,又該在什麼時候使用?要回答這個問題,必須先深入了解 ARC 實際如何運作。
閱讀文章閱讀 Swift 文章或版本資訊時,常會看到 SE-0296、SE-0345 這類代碼。介紹 async/await 的文章會標示 SE-0296,討論 if let name 縮寫語法時則會標示 SE-0345。這些編號究竟是什麼?
閱讀文章打開 Swift 標準函式庫,會發現一件醒目的事:Int、Double、Bool 等基本型別,以及 String、Array、Dictionary、Set,全都是 struct。在其他語言中理所當然是類別的型別,在 Swift 裡全都是值型別…
閱讀文章Swift 存在一種奇妙的共存:初學者能在 Playgrounds 用一行 print("Hello") 開始學習,但同一種語言也用來撰寫交織著泛型與巨集的標準函式庫。小學生的程式設計教育 App(Swift…
閱讀文章Swift Copy-on-Write 在值型別被指派時共用儲存空間,只有其中一方修改的瞬間才會實際複製。本篇說明這項最佳化如何維持值語意,同時降低原型模式的作用。
閱讀文章使用 Swift 撰寫程式碼時,你總會有些疑問:為什麼 Optional 這麼嚴格?為什麼陣列會被複製?為什麼有 guard?逐一深入這些問題,最後會遇到 Swift 從一開始就提出的三個目標:Safe(安全)、Fast(快速)、Expressive(具表達力)。
閱讀文章Swift 靜態工廠方法可透過名稱表達建立意圖,並控制回傳型別、快取與實例重用。本文整理選擇 static func make 而非 init 的優缺點,以及它與 GoF 模式的差異。
閱讀文章翻開設計模式的書,總會在接近最後的地方看到直譯器模式。這是很容易因為「這到底什麼時候會用到」而隨便跳過的模式。
閱讀文章你是否曾在不同類別中複製貼上相似邏輯,心想「這好像不太對」?在 iOS App 裡,當你第三次複製各畫面的資料載入程式碼時,手往往就會停下來。
閱讀文章從擴充字素叢集出發,說明 Swift String 不接受整數索引的原因,並透過實際執行結果確認韓文組合字串的 Character、Unicode scalar 與 UTF-8 差異。
閱讀文章使用 Swift 開發 App 時,我們每天會寫數十次像 for item in array 這樣的迴圈。因為太習慣了,直到嘗試用 for-in 迭代自訂型別並遇到編譯錯誤,才會好奇:「這個迴圈到底在內部做了什麼?」
閱讀文章Facade Pattern 會在多個物件交織的子系統前,提供一個簡單的單一入口。本文以 Swift 會員註冊為例,說明如何集中管理呼叫順序,以及它與 Adapter、Proxy、Decorator 的差異。
閱讀文章狀態模式會將各狀態的行為與轉換集中到物件或 enum 中,減少散落各處的條件判斷。本文說明重構 Swift 畫面狀態的順序與策略模式般的結構如何依設計意圖區分。
閱讀文章Swift guard 會先處理失敗條件,讓正常流程維持平坦。透過可執行範例確認它與 if 不同的編譯器保證、optional binding 的有效範圍,以及 return、throw、continue 的選擇標準。
閱讀文章開發 App 時,有時需要建立數千甚至數萬個相似物件。最典型的例子是在地圖上撒出數萬個標記;在這種情況下,記憶體圖表很容易持續攀升。
閱讀文章Swift 的錯誤處理工具,會依照處理失敗的時機與需要保留的資訊而分工。本篇搭配執行結果,整理 throws、do-catch、try?、try! 與 Result 的選擇方式。
閱讀文章這是 Swift 基礎系列第 3 篇。本文不羅列語法,而是以選擇準則整理五種屬性。核心問題只有一個:這個值會被儲存、被計算,以及何時建立?
閱讀文章原型模式透過複製既有物件,降低建立成本與重複設定。本文整理 Swift 值型別複製與類別 NSCopying 的差異,以及淺層複製和 Copy-on-Write 介入的時機。
閱讀文章學習 Swift 時首先遇到的關卡就是 Optional。String? 的問號、if let、guard let、!、??。語法種類很多,如果分別背誦,很容易把規則記得一團亂。
閱讀文章Swift 工廠函式會為建立邏輯加上表達意圖的名稱,並讓回傳型別與重用策略更具彈性。本文整理選擇 static func 而非 init 的判斷標準,以及它與 GoF 工廠方法的差異。
閱讀文章在 Swift 程式碼中,閉包無所不在:排序條件、網路完成處理常式、按鈕動作,甚至 SwiftUI 的 body。傳遞大括號區塊的程式碼每天會出現數十次。但要說明「閉包擷取值究竟是什麼意思」、「[weak self] 為什麼要用」以及「@escaping 為什麼需要標註」,很多人就會一時語塞。
閱讀文章適配器模式會將舊版 API 的介面轉換成新程式碼所期待的協定。本篇整理如何在 Swift 中建立轉換邊界、簡化替換與測試,以及它和其他包裝模式的差異。
閱讀文章進行 Swift 開發時,經常會遇到只用一行 static let shared 建立的 Singleton。
閱讀文章開始 iOS 開發後,相信每個人都曾經好奇過:「Apple 明明已經很熟練地使用 Objective-C,為什麼還要特別重新打造 Swift?」
閱讀文章使用 Swift 開發 App 時,是否曾經用 do-catch 捕捉錯誤,卻發現真正顯示在畫面上的訊息實在不太理想?
閱讀文章