Swift Interview Deep Dive #01

更新 發佈閱讀 7 分鐘

Struct vs Class:你以為你在選型,其實你在設計「狀態」

大多數 iOS 工程師在面試被問到:

Struct 和 Class 有什麼差別?

通常會回答:

  • Struct 是 value type
  • Class 是 reference type
  • Struct 會 copy,Class 不會

然後結束。

但問題是 — — 這種答案幾乎沒有解釋任何「設計層級的意義」。

在真實的 iOS 專案裡,這題真正考的不是語法,而是:

你如何設計「狀態(state)」與「資料流(data flow)」

1. Struct vs Class 從來不是語法問題

Struct(Value Type)

struct User {

var name: String

}
var user1 = User(name: "Wayne")

var user2 = user1user2.name = "Kevin"

結果:

user1.name = "Wayne"

user2.name = "Kevin"

👉 各自獨立

Class(Reference Type)

class User {

var name: String
    init(name: String) {

self.name = name }}var user1 = User(name: "Wayne")

var user2 = user1user2.name = "Kevin"

結果:

user1.name = "Kevin"

user2.name = "Kevin"

👉 共享同一個 instance

到這裡,大多數人就停了。

但真正的問題才剛開始。

2. 真正的核心差異:你是否「共享狀態」

這兩種設計,本質上在回答一個問題:

這份資料,應不應該被共享?

Struct 的世界觀:資料是「獨立的」

Struct 假設的是:

  • 每一份資料都是獨立的
  • 修改不應該影響其他人
  • 行為應該是可預測的

👉 它追求的是:

deterministic state(可預測狀態)

Class 的世界觀:物件是「共享的」

Class 假設的是:

  • 這個 instance 是唯一的
  • 多個地方可以引用它
  • 改動是「同步發生」的

👉 它追求的是:

shared identity(共享身份)

3. 真正讓系統失控的,是「共享可變狀態」

看這段:

class Cart {

var items: [String] = []

}
let cartA = Cart()

let cartB = cartAcartB.items.append("iPhone")

問題不是 syntax,而是:

你已經失去「誰改了 state」的控制權

在小專案這不是問題,但在大型專案會變成:

  • ViewModel 改 state
  • Service 改 state
  • Cache 改 state
  • Singleton 改 state

最後你會開始問:

到底是誰改壞我的資料?

這不是 bug。

這是設計問題。

4. 為什麼 Swift 反而鼓勵 Struct?

Swift 的核心設計哲學是:

Make state predictable.

也就是:

讓狀態變得可推理

Struct 帶來三個關鍵優勢:

① 可預測性(Predictability)

資料不會被隱性修改

② 可測試性(Testability)

input → output 清楚

③ 可推理性(Reasoning)

不用追蹤 reference chain

這也是為什麼 SwiftUI 幾乎全是 struct。

因為 SwiftUI 本質是:

UI = function(state)

5. 那 Class 什麼時候才是正確選擇?

不是「不要用 Class」,而是:

只有在你需要 identity 的時候才用 Class

✔ Shared Resource

final class NetworkManager {

static let shared = NetworkManager()

}

✔ Lifecycle Object

例如:

  • URLSession
  • AVPlayer
  • UIViewController

✔ Observable Object(SwiftUI)

class ViewModel: ObservableObject {

@Published var name = ""

}

👉 重點不是「可不可以共享」,而是:

你需不需要共享同一個 identity

6. SwiftUI / TCA 為什麼幾乎全部用 Struct?

因為它們解決的是同一個問題:

如何讓 state flow 可追蹤

Struct 帶來的是:

  • 沒有 hidden mutation
  • state change 是顯式的
  • diff 可以被計算
  • UI 可以被重建

TCA 本質上是在強制你接受:

state 必須是可預測的 flow,而不是自由變動的物件

7. 這題真正想測的能力是什麼?

面試官其實不是在問:

你知不知道 value vs reference

而是在問:

你能不能設計一個「不會失控的狀態系統」

更深一層其實是:

  • 你會不會避免 shared mutable state
  • 你知不知道 side effect 從哪裡來
  • 你能不能預測資料流
  • 你能不能 debug state corruption

結論

Struct vs Class 不是選擇題。

它其實是一個設計問題:

你要選擇「自由共享」還是「可預測性」

Swift 的答案很清楚:

預設選擇可預測性,除非你真的需要 identity。

延伸思考

當你開始進入 SwiftUI、TCA、Concurrency,你會發現:

Swift 的演進方向不是 OOP 的進化版,而是:

State-driven programming

而 Struct vs Class,只是入口而已。




留言
avatar-img
WL的沙龍
0會員
5內容數
Swift • SwiftUI • iOS Focus on state, architecture, and system design.
你可能也想看
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
Thumbnail
本篇介紹了Swift程式語言中的各種流程控制元素,包括條件語句(如if, else if, else),三元運算子,多條件分支判斷的switch語句,以及各種迴圈(如for迴圈,while迴圈,以及repeat-while迴圈)。同時也詳細解釋了如何進行迴圈嵌套,以及如何使用控制迴圈語句。
Thumbnail
此章節旨在介紹Swift程式語言中的基本資料型別,包括整數、浮點數、布林型別、字串、字符、選擇型、型別轉換、自訂型別(包括類、結構和枚舉)、元組型別、集合型別、陣列型別和字典型別。每種型別的說明都包含了程式碼範例,以便讀者更好地理解其應用和使用方式。
Thumbnail
此章節旨在介紹Swift程式語言中的基本資料型別,包括整數、浮點數、布林型別、字串、字符、選擇型、型別轉換、自訂型別(包括類、結構和枚舉)、元組型別、集合型別、陣列型別和字典型別。每種型別的說明都包含了程式碼範例,以便讀者更好地理解其應用和使用方式。
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
見諸參與鄧伯宸口述,鄧湘庭於〈那個大霧的時代〉記述父親回憶,鄧伯宸因故遭受牽連,而案件核心的三人,在鄧伯宸記憶裡:「成立了成大共產黨,他們製作了五星徽章,印刷共產黨宣言——刻鋼板的——他們收集中共空飄的傳單,以及中國共產黨中央委員會有關文化大革命決議文的英文打字稿,另外還有手槍子彈十發。」
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
這個章節主要介紹了Swift程式語言中物件導向程式設計的基本概念,包括類別、建構子、公開、私有、受保護等等的概念。同時,也介紹了繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射等進階特性。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
當代名導基里爾.賽勒布倫尼科夫身兼電影、劇場與歌劇導演,其作品流動著強烈的反叛與詩意。在俄烏戰爭爆發後,他持續以創作回應專制體制的壓迫。《傳奇:帕拉贊諾夫的十段殘篇》致敬蘇聯電影大師帕拉贊諾夫。本文作者透過媒介本質的分析,解構賽勒布倫尼科夫如何利用影劇雙棲的特質,在荒謬世道中尋找藝術的「生存之道」。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
此章節旨在解釋Swift語言中函數的基本結構和操作方式,包括函數的聲明、呼叫、參數和返回值。閱讀這個章節可以幫助你理解並掌握如何在Swift編程中有效地使用和管理函數。
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
5 月,方格創作島正式開島。這是一趟 28 天的創作旅程。活動期間,每週都會有新的任務地圖與陪跑計畫,從最簡單的帳號使用、沙龍建立,到帶著你從一句話、一張照片開始,一步一步找到屬於自己的創作節奏。不需要長篇大論,不需要完美的文筆,只需要帶上你今天的日常,就可以出發。征服創作島,抱回靈感與大獎!
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
本文檔介紹了在Swift中使用套件的詳細方法,包括如何引用第三方套件和自定義模組,如何創建自定義套件,以及一些常見的Swift套件。這些套件可以幫助開發者快速添加功能到項目中,提高開發效率和程式碼品質。
Thumbnail
本章節為Swift程式語言的異常處理介紹,說明了為何需要進行異常處理以及如何進行異常處理。提供了使用do、try、catch和throw關鍵字進行異常處理的基本語法並展示了其在實際程式中的應用。同時也說明了Swift中的一些常見異常類型,並且教導了如何主動觸發異常訊息和定義自己的異常類型。
Thumbnail
本章節為Swift程式語言的異常處理介紹,說明了為何需要進行異常處理以及如何進行異常處理。提供了使用do、try、catch和throw關鍵字進行異常處理的基本語法並展示了其在實際程式中的應用。同時也說明了Swift中的一些常見異常類型,並且教導了如何主動觸發異常訊息和定義自己的異常類型。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
本章節介紹了如何建立並設置Swift項目以及如何選擇和設置Swift代碼編輯器。這包括在Xcode和命令行中建立Swift項目,選擇Xcode、Visual Studio Code或AppCode作為編輯器,以及如何使用SPM安裝插件。
Thumbnail
本章節介紹了程式語言中的各種運算符,包括算數運算子、比較運算子、賦值運算子、位元運算子,以及運算子的優先等級。每種運算子都有對應的範例程式碼和輸出結果,以幫助讀者更好地理解其用法和效果。此外,章節也強調了運算子的優先等級在程式設計中的重要性,並通過範例展示了不同優先等級的運算順序對運算結果的影響。
Thumbnail
本章節介紹了程式語言中的各種運算符,包括算數運算子、比較運算子、賦值運算子、位元運算子,以及運算子的優先等級。每種運算子都有對應的範例程式碼和輸出結果,以幫助讀者更好地理解其用法和效果。此外,章節也強調了運算子的優先等級在程式設計中的重要性,並通過範例展示了不同優先等級的運算順序對運算結果的影響。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
Thumbnail
當時間變少之後,看戲反而變得更加重要——這是在成為母親之後,我第一次誠實地面對這一件事:我沒有那麼多的晚上,可以任性地留給自己了。看戲不再只是「今天有沒有空」,而是牽動整個週末的結構,誰應該照顧孩子,我該在什麼時間回到家,隔天還有沒有精神帶小孩⋯⋯於是,我不得不學會一件以前並不擅長的事:挑選。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News