Deinitialization: 消滅
stored property: 儲存式屬性, 像用 var 所定義出來的變數屬性或是 let 所定義出來的常數屬性等
computed property: 運算式屬性, 用程式運算出來的結果, 像是跑完 closure 的回傳值等
struc 及 class 的 stored property 必須要初始化,初始化 stored property 的方式可以直接給定一個初始值, 或是用初始化程序一一設定.如果自製型別裡有 stored property, 而它允許是 nil 值, 則應該將它設為 optionals. 就是在型別名後加問號'?' 因此以下敘述是合法的, 實際上 a 會被指定等於 nil
class my {
var a:String?
}
但以下敘述是不合法的, 因為 stored property 必須要初始化
class my {
var a:String
}// the above declaraction is not allowed
應該改成
class my {
var a:String=""
}
或是改成用 init 程序來初始化它
class my {
var a:String
init() { a="" }
}
let b=my()
Customizing Initialization: 客制化初始值是透果參數傳遞方式去給定, 這些參數稱做起始參數(Initialization parameters), 而起始參數的語法與 func 裏面的傳遞參數的語法是相同的,起始程序可以用不同形式但用相同 init 的名稱來初始化, 即使在型別裡設定為常數屬性, 仍然可以重新初始化, 例如
class my {
let name:String
init(name:String) { self.name=name }
init() { self.name="" }
}
let a=my()
let a=my(name:"new")
Default Initializers: 就是 stored property 被宣告初始值時的預設初始程序
Memberwise Initializers for Structure Types: 對於結構 (struc)而言, 即使沒有自訂初始化程序, 但當客制化成員呼叫時, 他仍會按照成員一一初始化內部它的儲存式屬性(stored property) .因為結構是 value type, 如果沒用自訂初始化程序,當屬性宣告成常數時, 他會變成不可修改的,因此要再用客制初始它會變成不合法, 一旦自行定義 init 程序, 那 Memberwise Initializers 將會失效如同被覆蓋(override)一樣, 那在自行定義的初始化程序中,不管常數或變數, 即使有初始值, 仍然可以再重新客制化過, 像上面的 class 如果將它他改成 struct 也是可行的.
struct my {
let name="constName"
}
// it is not legal to assign the constant property in structure if not define the init() method
// let b=my(name:"New") // illegal statement// it is not legal to assign the constant property in structure if not define the init() method
因此要能再客制化的話, 只要將它改成變數就可以了
struct my {var name="varName"
}
let b=my(name:"New") // it is fine when name was declared as a variable
Initializer delegation for value type: 委託初始化數值型別, 代辦初始化數值型別, 就是初始化程序再去呼叫別的初始化程序就叫作 Initializer delegation. struc 及 enum 屬 value type, 不能繼承, 其代辦初始化可以較簡單, 但 class 就不同, 因為繼承到別人的屬性, 因此必須要適當的初始化 所有的儲存式屬性(stored property)
Designate Initializers: 指定特別的初始程序, 是隸屬該 class 內的主要初始化程序, 並且傳遞(chain)呼叫上層 class 的初始化程序, 因此 class 通常只有一個 designate Initializerr
Convenience Initializers: 方便的初始程序, 他最後會呼叫 designate Initializer 或別的 Convenience Initializers, 如果不需要也可以不用寫, 它必須用關鍵字 convenience 加在 init() 之前
消滅程序使用deinit() 來定義, 只有 class 可以定義消滅程序
沒有留言:
張貼留言