在 Swift 中,類與結構體是構建複雜數據類型的兩大支柱。它們語法相似、功能重疊,但語義差異巨大。本文將從定義語法、存儲模式、繼承、生命周期、身份比較等維度深度對比,並給出實戰選擇建議。
// 類
class Person {
var name: String = ""
var age: Int = 0
func say(_ content: String) { print(content) }
}
// 結構體
struct Point {
var x: Double, y: Double
func distance(to other: Point) -> Double {
sqrt((x-other.x)*(x-other.x) + (y-other.y)*(y-other.y))
}
}
兩者均支援:屬性、方法、下標、構造器、協議遵循、擴展。
| 特性 | 結構體 | 類 |
|---|---|---|
| 存儲模式 | 棧/內聯 | 堆 |
| 賦值/傳遞 | 複製 | 引用共享 |
| 繼承 | 不支援 | 支援 |
| 析構器 | 無 | deinit |
| 身份比較 | 不可用 | ===/!== |
| 線程安全 | 天然更安全 | 需額外同步 |
struct Resolution { var width=0, height=0 }
var hd = Resolution(width: 1920, height: 1080)
var cinema = hd // 複製
cinema.width = 2048
print(hd.width) // 1920,原值未變
print(cinema.width) // 2048
class VideoMode { var resolution = Resolution() }
let ten80p = VideoMode()
ten80p.resolution = hd
let alsoTen80p = ten80p // 同一實例
alsoTen80p.resolution.width = 2048
print(ten80p.resolution.width) // 2048,共享變化
struct Size { var w: Double, h: Double }
let s1 = Size(w: 10, h: 20) // 成員級構造器
let s2 = Size() // 需屬性有默認值才可用
let p1 = Person(name: "孫悟空", age: 2100)
let p2 = Person(name: "六小齡童", age: 48)
let p3 = p1
print(p1 === p2) // false,不同實例
print(p1 === p3) // true, 同一實例
print(p1 !== p2) // true
結構體比較內容相等請實作 Equatable 協議。
NSObject)struct Wrapper {
var array: [Int] = [] // Array 是結構體但內部引用緩衝區
}
var w1 = Wrapper()
w1.array.append(1)
var w2 = w1 // 複製 Wrapper,但 array 共享緩衝區(COW)
w2.array.append(2) // 觸發複製寫入,w1 不受影響
print(w1.array) // [1]
print(w2.array) // [1, 2]
Swift 標準庫集合類型實現了複製寫入,值語義在大多數場景下表現如預期。
理解「值 vs 引用」是 Swift 開發的分水嶺。現代 Swift 開發傾向「面向協議編程 + 值類型為主」,類專注於需要身份與共享狀態的場景。掌握兩者邊界,能寫出更安全、高效、可維護的代碼。
下一期我們將探討 Swift 屬性觀察器、延遲存儲屬性與屬性包裝器,敬請期待。