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