首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Swift 核心基礎(八):類與結構體深度對比與選擇指南

     編輯:關於C語言

前言

在 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))
    }
}

兩者均支援:屬性、方法、下標、構造器、協議遵循、擴展。

二、核心差異:值類型 vs 引用類型

特性結構體類
存儲模式棧/內聯堆
賦值/傳遞複製引用共享
繼承不支援支援
析構器無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 協議。

五、實戰選擇決策樹

  1. 需要繼承/多態? → 類
  2. 需要 Objective-C 互操作? → 類(繼承 NSObject)
  3. 數據模型單純、無身份概念、希望值語義? → 結構體
  4. 高頻創建/銷毀、性能敏感? → 結構體(棧分配、無引用計數開銷)
  5. 需共享可變狀態(如控制器、管理器)? → 類
  6. 不確定? → 優先結構體,需要時再重構為類。

六、進階:結構體中的引用類型陷阱

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 屬性觀察器、延遲存儲屬性與屬性包裝器,敬請期待。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved