Swift Interview Deep Dive #04

更新 發佈閱讀 10 分鐘

@State、@Binding、@ObservedObject 到底差在哪?SwiftUI 的 State System 真正設計思想

很多 iOS 工程師在學 SwiftUI 時,最常問的是:

@State、@Binding、@ObservedObject、@StateObject 到底怎麼分?

然後開始背:

  • @State 給自己用
  • @Binding 給子 View
  • @ObservedObject 給外部 object
  • @StateObject 負責生命週期

背完之後,畫面可能能跑。

但只要專案開始變大,很快就會出現:

  • state 不同步
  • UI 不更新
  • object 被重建
  • ViewModel 消失
  • 畫面亂刷新
  • lifecycle 混亂

因為 SwiftUI 真正困難的地方,從來不是 syntax。

而是:

你是否理解「State Ownership」


1. SwiftUI 的本質:View 是 State 的投影

UIKit 時代:

你操作 View

SwiftUI 時代:

你改變 State

View 只是:

State 的結果(projection)


例如:

struct CounterView: View {

@State private var count = 0

var body: some View {
Text("\(count)")
}
}

真正重要的不是:

Text()

而是:

count

因為:

SwiftUI 是 state-driven UI framework


2. SwiftUI 最大誤解:View 不是真正的畫面

這是 SwiftUI 最反直覺的地方。

很多人以為:

struct MyView: View

是一個畫面 instance。

其實不是。


SwiftUI View 本質上更像:

State Description

甚至可以理解成:

UI Function

例如:

var body: some View {
Text("\(count)")
}

其實很接近:

UI = f(state)

這也是為什麼:

View 可以被瘋狂重建

因為真正重要的不是 View。

而是:

State 是否被保存

3. @State 真正代表的是「Local Ownership」

很多人背:

@State 是 local state

但這不夠準確。

真正意思是:

這份 state 的 ownership 屬於這個 View


例如:

struct CounterView: View {

@State private var count = 0

var body: some View {
Button("\(count)") {
count += 1
}
}
}

重點不是:

count 可以改

而是:

SwiftUI 幫你保存 state lifecycle

即使 View 被重新建立:

State 仍然存在

4. 為什麼普通 var 不能更新 UI?

例如:

struct CounterView: View {

var count = 0

var body: some View {
Text("\(count)")
}
}

因為:

SwiftUI 不追蹤普通 property

只有被 State System 管理的資料:

  • @State
  • @Binding
  • @ObservedObject
  • @EnvironmentObject

才會觸發:

View invalidation

5. @Binding 真正的本質:Temporary Ownership Transfer

很多人背:

@Binding 是雙向綁定

但真正更準確的是:

Ownership 沒有改變,只是暫時借你修改權限


例如:

struct ParentView: View {

@State private var isOn = false

var body: some View {
ChildView(isOn: $isOn)
}
}

子 View:

struct ChildView: View {

@Binding var isOn: Bool
}

重點是:

真正擁有 state 的仍然是 ParentView

Child 只是:

獲得修改權限

這其實非常像:

reference to value ownership

6. @ObservedObject 最大問題:Ownership 不明確

這是很多 SwiftUI bug 的來源。

例如:

struct ContentView: View {

@ObservedObject var vm = ViewModel()
}

很多人以為沒問題。

但其實:

View 重建時 vm 可能也被重建

因為:

ObservedObject 不負責 lifecycle

它只是:

觀察外部 object

7. @StateObject 為什麼會出現?

因為 Apple 發現:

大家都在亂管理 object lifecycle

所以:

@StateObject private var vm = ViewModel()

真正意思是:

這個 View 擁有 ViewModel 的生命週期


這很重要。

因為 SwiftUI 真正困難的從來不是畫 UI。

而是:

誰擁有 state

8. SwiftUI 最大核心:Single Source of Truth

這是 SwiftUI 幾乎所有設計的核心。

問題永遠是:

這份 state 到底誰說了算?


如果:

  • Parent 一份 state
  • Child 一份 state
  • ViewModel 又一份 state

最後就會:

state divergence

也就是:

資料不同步

所以 SwiftUI 一直強調:

Single Source of Truth


9. 為什麼 TCA 幾乎是 SwiftUI 的終極延伸?

因為 SwiftUI 雖然有 State System。

但:

大型專案 state 還是容易失控

所以 TCA 開始進一步強制:

  • 單向資料流
  • centralized state
  • predictable mutation
  • effect isolation

本質上:

TCA 是把 SwiftUI 的 State Thinking 推到極致


10. SwiftUI 真正困難的是「State Explosion」

小專案:

SwiftUI 很快樂

大專案:

state 開始爆炸

例如:

  • loading state
  • navigation state
  • sheet state
  • async state
  • cache state
  • error state

最後:

整個畫面都在同步 state

這也是為什麼:

State Management 會變成架構問題

不是 UI 問題。


11. 面試真正想考的是什麼?

這類題目真正考的不是:

你會不會用 property wrapper

而是:

  • 你是否理解 ownership
  • 你知不知道 lifecycle
  • 你能不能管理 state flow
  • 你會不會避免 duplicated state
  • 你能不能設計 predictable UI

真正成熟的工程師,不會只背:

@State 給自己用

而是會知道:

每個 property wrapper 都代表不同的 state ownership model


結論

SwiftUI 的核心從來不是:

Declarative UI

真正的核心其實是:

State Ownership System


而:

  • @State
  • @Binding
  • @ObservedObject
  • @StateObject

本質上都在回答同一件事:

這份 state 到底誰擁有?


延伸思考

當你開始深入:

  • TCA
  • Actor
  • Async State
  • Reducer Architecture
  • Unidirectional Data Flow

你會發現:

SwiftUI 真正想推動的方向其實是:

讓 UI 不再直接操作畫面,而是操作 state。

因為:

畫面本身不難管理
真正難管理的是 state。
留言
avatar-img
WL的沙龍
0會員
5內容數
Swift • SwiftUI • iOS Focus on state, architecture, and system design.
WL的沙龍的其他內容
2026/05/14
GCD vs Async/Await:Swift Concurrency 到底改變了什麼? 很多 iOS 工程師在面試被問到: GCD 跟 async/await 差在哪? 通常會回答: GCD 是 callback-based async/await 比較好讀 async/await
2026/05/14
GCD vs Async/Await:Swift Concurrency 到底改變了什麼? 很多 iOS 工程師在面試被問到: GCD 跟 async/await 差在哪? 通常會回答: GCD 是 callback-based async/await 比較好讀 async/await
2026/05/14
Struct vs Class:你以為你在選型,其實你在設計「狀態」 大多數 iOS 工程師在面試被問到: Struct 和 Class 有什麼差別? 通常會回答: Struct 是 value type Class 是 reference type Struct 會 copy,Clas
2026/05/14
Struct vs Class:你以為你在選型,其實你在設計「狀態」 大多數 iOS 工程師在面試被問到: Struct 和 Class 有什麼差別? 通常會回答: Struct 是 value type Class 是 reference type Struct 會 copy,Clas
2026/05/14
ARC 與 Memory Leak:為什麼 Swift 還是會記憶體洩漏? 很多人第一次學 Swift 時,都會以為: Swift 有 ARC,所以不會 memory leak。 但實際上,只要你做過中大型 iOS 專案,你很快就會發現: Swift 不但會 leak,而且很容易 leak。
2026/05/14
ARC 與 Memory Leak:為什麼 Swift 還是會記憶體洩漏? 很多人第一次學 Swift 時,都會以為: Swift 有 ARC,所以不會 memory leak。 但實際上,只要你做過中大型 iOS 專案,你很快就會發現: Swift 不但會 leak,而且很容易 leak。
看更多
你可能也想看
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
一、 開發前準備 環境: Xcode 15+ / Swift 5.9+框架: * SwiftUI: 建構使用者介面。Swift Charts: 製作圖片中的複利增長曲線。Combine 或 Swift Data: 處理數據流與本地存儲。 二、 核心功能開發步驟 1. 建立複利數據模型 (
Thumbnail
一、 開發前準備 環境: Xcode 15+ / Swift 5.9+框架: * SwiftUI: 建構使用者介面。Swift Charts: 製作圖片中的複利增長曲線。Combine 或 Swift Data: 處理數據流與本地存儲。 二、 核心功能開發步驟 1. 建立複利數據模型 (
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
開發者無可避免要依賴第三方工具與服務,但這些依賴背後藏著什麼風險?我在職涯早期,曾因一項免費同步服務突然下架,白忙了數個月,卻也因此建立了看待 dependency 的深刻觀點。這篇從實際經驗談起,分享我如何判斷、選擇,甚至參與貢獻 dependency,來有效降低風險。
Thumbnail
開發者無可避免要依賴第三方工具與服務,但這些依賴背後藏著什麼風險?我在職涯早期,曾因一項免費同步服務突然下架,白忙了數個月,卻也因此建立了看待 dependency 的深刻觀點。這篇從實際經驗談起,分享我如何判斷、選擇,甚至參與貢獻 dependency,來有效降低風險。
Thumbnail
第一篇文章,就先不談技術,來聊聊這個部落格(沙龍)名稱。 我目前主要技能樹點在 iOS 開發,姑且可以稱作一位 iOS 軟體工程師XD。 如標題所述,我的本科專業是法律,並在取得法學碩士及律師執照後做了幾年訴訟律師,每天的生活就是......
Thumbnail
第一篇文章,就先不談技術,來聊聊這個部落格(沙龍)名稱。 我目前主要技能樹點在 iOS 開發,姑且可以稱作一位 iOS 軟體工程師XD。 如標題所述,我的本科專業是法律,並在取得法學碩士及律師執照後做了幾年訴訟律師,每天的生活就是......
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
iOS 與 Xcode 的 Bug 常常藏在 Release Notes 裡。閱讀它能幫你避開 beta 版的坑,節省數小時的除錯時間,是個投資報酬率很高的好習慣。
Thumbnail
iOS 與 Xcode 的 Bug 常常藏在 Release Notes 裡。閱讀它能幫你避開 beta 版的坑,節省數小時的除錯時間,是個投資報酬率很高的好習慣。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News