2017-03-06 51 views
0

我習慣於編寫共享的- (void) initialize函數來處理Objective-C中的initWithFrameinitWithCoder函數。如何在Swift中的兩個init函數之間共享初始化函數?

但是,在Swift中我似乎沒有被允許在調用super.init()之前調用一個函數來做到這一點,因爲在此之前需要對屬性進行初始化。

我認爲編寫一個initWithFrame不再那麼重要,但如果我有一個自定義類有多個init方法,我想通過使用共享初始化程序來簡化? )

required init?(coder aDecoder: NSCoder) {   
    self.initialize()//use of self in method call initialize before super.init() 
    super.init(coder: aDecoder)  
} 

super.init後(:

super.init()之前

required init?(coder aDecoder: NSCoder) {   
    super.init(coder: aDecoder) 
    self.initialize()//property not initialized at super.init call 
} 

`

+0

@vadian有你的答案。在初始化超視圖之前和之後,您還可以將「共享」部分分解爲所需*。雖然不是一行代碼(或函數),但它確實簡化了一些事情。 – dfd

回答

1

這取決於存儲的屬性進行初始化。

例如,你可以一個默認值分配到屬性

class Foo { 

    var name = "" 
    var age = 0 

    let formatter : DateFormatter = { 
     let df = DateFormatter() 
     df.dateFormat = "yyyy/MM/dd" 
     return df 
    }() 
} 

或使用隱展開自選

class Foo { 

    var name = String! 
    var age = Int! 

    var formatter : DateFormatter! 

} 

在這兩種情況下,所有的屬性將被初始化,您可以先調用super然後初始化方法。然而,出於安全原因,建議使用第一種方法。

反正規則是:

  • 所有非可選屬性必須初始化之前調用超級self可以是僅用於後調用超級
+0

是的,我確實解決了這個問題。只需在屬性聲明中設置屬性的默認值,然後在'super.init()'之後處理共享方法中的所有其他內容。謝謝。 – Peterdk

相關問題