
實體物件 (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 |
沒有留言:
張貼留言