2016年4月14日 星期四

swift 學習筆記 8: Initialization 及Deinitialization

Initialization: 初始化
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
因此要能再客制化的話, 只要將它改成變數就可以了
       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 可以定義消滅程序


沒有留言: