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