Swift 入門指南 V1.00 - 單元 11 - 建構子與解構子




實體物件 (object) 建立需要經過初始化 (initialization) 的步驟,結束執行則會經過解初始化 (deinitialization) 的步驟



初始化由關鍵字 (keyword) init 來定義,結構 (structure) 會有預設的 init ,因此不用自己寫,可是定義類別 (class) 就得自己完整寫出來了。


init 的部分通稱為建構子 (initializer) ,舉例如下


class ClassDemo {
   var a: Int
   let b: Int
 
   // 建構子
   init() {
      a = 2
      b = 10
   }
 
   // doSomething() 的第一個版本
   func doSomething() -> Int {
      return a + b
   }
 
   // doSomething() 的第二個版本
   func doSomething(a: Int, b: Int) -> Int {
      return a + b
   }
}
 
var demo1 = ClassDemo()
demo1.doSomething()
demo1.doSomething(12, b: 34)

建構子最主要的任務就是設定儲存性屬性 (stored property) 的初始值


// 建構子
init() {
   a = 2
   b = 10
}

這個例子也定義了兩個相同識別字 (identifier) 的方法 (method) ,這兩個方法有不同的參數列 (parameter list)


// doSomething() 的第一個版本
func doSomething() -> Int {
   return a + b
}
 
// doSomething() 的第二個版本
func doSomething(a: Int, b: Int) -> Int {
   return a + b
}

這樣的概念被稱之為多載 (overload) ,讓具有相同功能的方法或函數使用相同的名稱,僅需改變參數列即可。


輸入到 Playground ,結果如下



這同樣適用在建構子的部分,例如


class ClassDemo2 {
   var t: Double
   // 攝氏的建構子版本
   init(fromCelsius c: Double) {
      t = c
   }
   // 華氏的建構子版本
   init(fromFahrenheit f: Double) {
      t = (f - 32.0) / 1.8
   }
}
 
let demo2 = ClassDemo2(fromCelsius: 15.0)
demo2.t
let demo3 = ClassDemo2(fromFahrenheit: 180.5)
demo3.t

此例是一個儲存溫度的類別,屬性 t 儲存的是攝氏溫度,建立實體物件時,可依華氏溫度的參數 (parameter) fromFahrenheit 或攝氏溫度的參數 fromCelsius 設定屬性 t


輸入到 Playground ,結果如下



解初始化則由關鍵字 deinit 來定義,這部分也被通稱為解構子 (deinitializer) 。例如


class ClassDemo3 {
   var a: Int
 
   init() {
      a = 22
   }
 
   // 解構子
   deinit {
      a = 0
   }
}
 
var demo4: ClassDemo3? = ClassDemo3()
demo4?.a
demo4 = nil
demo4?.a

解構子只用 deinit 標記,不需要任何參數


// 解構子
deinit {
   a = 0
}

這裡的例子僅作示範解構子的寫法用。

輸入到 Playground ,結果如下



結構與類別的基本定義介紹到這裡,下一個單元繼續討論兩者的不同。


中英文術語對照


物件object
初始化initialization
解初始化deinitialization
關鍵字keyword
結構structure
類別class
建構子initializer
儲存性屬性stored property
識別字identifier
方法method
參數列parameter list
多載overload
參數parameter
解構子deinitializer

沒有留言: