2015-12-14 49 views
0

在ObjC我曾經在我的init東西叫像與功能斯威夫特INIT作出明確的區分

- init() { 
[self initView1] 
[self initView2] 
} 

到的意見

但在迅疾我不能調用一個函數設置分離在設置任何變量之前,是否有我丟失或不可能的東西?

+0

這應該可以在你調用'super.init()'後。或者我錯過了什麼? – dasdom

+0

我沒有超級,我的變量設置在各自的initViewX – CiNN

+0

這是不可能的,據我所知。 – dasdom

回答

1

您可以在自己的報關行分配初始值:

var prop1: String! 
    var prop2: String! 

這告訴編譯器:

class MyClass { 
    var prop1: String = "" 
    var prop2: String = "" 

    init() { 
     self.initView1() 
     self.initView2() 
    } 

    func initView1() { 
     self.prop1 = "Hello" 
    } 

    func initView2() { 
     self.prop2 = "World" 
    } 
} 

或者,通過添加一個感嘆號(!)讓他們暗中展開自選程序員已經保證這些屬性在使用前將被正確初始化。

+0

我嘗試使用協議默認實現,並有一個默認值打破默認實現在協議擴展中使用計算的變量 – CiNN

+0

然後使用隱式解包的optionals。 –

0

在Swift中,每個屬性都必須初始化,然後才能調用方法。

這在Swift編程語言手冊的Two-Phase Initialization一章中有詳細描述。

如果您想將初始化委託給某個方法,那麼您至少必須首先提供一些虛擬值。或者,你可以重構你的代碼,從靜態方法創建你的視圖(如果可能的話);那麼你可以使用這些對象進行初始化:

class MyClass { 
    let prop1: String 
    let prop2: String 

    static func create1() -> String { 
    return "Hello" 
    } 

    static func create2() -> String { 
    return "World" 
    } 

    init() { 
    prop1 = Blah.create1() 
    prop2 = Blah.create2() 
    } 
}