Swift 建構與解構 (Initialization)

建構過程是準備一個類別、結構或列舉實例以供使用的過程。你需要定義建構器 (Initializers) 來設定初始值。

基本語法 (init)

struct Fahrenheit {
    var temperature: Double
    
    init() {
        temperature = 32.0 // 預設值
    }
}

var f = Fahrenheit()
print("The default temperature is \(f.temperature)° Fahrenheit")

建構參數

就像函式一樣,init 可以接受參數:

struct Celsius {
    var temperatureInCelsius: Double
    
    init(fromFahrenheit fahrenheit: Double) {
        temperatureInCelsius = (fahrenheit - 32.0) / 1.8
    }
    
    init(fromKelvin kelvin: Double) {
        temperatureInCelsius = kelvin - 273.15
    }
}

let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
let freezingPointOfWater = Celsius(fromKelvin: 273.15)

成員逐一建構器 (Memberwise Initializers)

對於 Struct,如果我們沒有定義任何自定義的 init,Swift 會自動免費提供一個包含所有屬性的建構器:

struct Size {
    var width = 0.0, height = 0.0
}

let twoByTwo = Size(width: 2.0, height: 2.0) // 自動生成的
Class 不會有這種自動的成員逐一建構器。

便利建構器 (Convenience Initializers)

這是 Class 特有的概念。

  • 指定建構器 (Designated Initializer):主要建構器,必須初始化所有屬性並呼叫父類別 init
  • 便利建構器 (Convenience Initializer):輔助建構器,可以提供一些捷徑,必須呼叫同一個類別中的其他 init
class Food {
    var name: String
    // 指定建構器
    init(name: String) {
        self.name = name
    }
    
    // 便利建構器
    convenience init() {
        self.init(name: "[Unnamed]")
    }
}

可失敗建構器 (Failable Initializers)

定義可能初始化失敗的建構器,使用 init?。回傳的是 Optional。

struct Animal {
    let species: String
    init?(species: String) {
        if species.isEmpty { return nil }
        self.species = species
    }
}

解構器 (Deinitialization)

deinit 只有 Class 有。當實例被釋放前會自動呼叫,通常用於釋放非記憶體的資源 (如關閉檔案、網路連線)。

class Bank {
    deinit {
        // 執行清理工作
        print("Bank is closed")
    }
}