2014-10-12 54 views
1

我使用XLForm,它有一個類XLFormDescriptor,需要用init(title: String)進行初始化。使用Swift初始化屬性時遇到問題

我想要使用的標題是我當前類的名稱函數的返回值(類級屬性不是一個功能)。

在類級別把這個,代碼來設置它看起來像這樣:

let settingsForm = XLFormDescriptor(title: self.name()) 

但這給出了錯誤:

'PanelController ->() -> PanelController!' does not have a member named 'name'

在類的init的頂部把此看起來像這樣:

let settingsForm: XLFormDescriptor 

override init() { 
    self.settingsForm = XLFormDescriptor(title: self.dynamicType.name()) 

    super.init() 
} 

而這樣做會產生此錯誤:

'self' used before super.init call

把它super.init()後,給出了這樣的錯誤:

Property 'settingsForm' not initialized at super.init call

任何想法如何我都不可能做到這一點?

編輯:一種解決方法是這樣:

let settingsForm = XLFormDescriptor(title: "") 

override init() { 
    super.init() 
    self.settingsForm = XLFormDescriptor(title: self.dynamicType.name()) 
} 

回答

1

在迅速,直到所有的類屬性已初始化self不可用。在編譯時有一個檢查。

所以,如果你有屬性的類,從另一個類繼承:

class A { 
    var prop1: Int 
    init(val1: Int) { 
     self.prop1 = val1 
    } 
} 

class B : A { 
    var prop2: String 
    override int(val1: Int, val2: String) { 
     // First initialize properties of this class 
     self.prop2 = val2 

     // Next call a superclass initializer 
     super.init(val1: val1) 

     // From now on, you can use 'self' 
    } 
} 

不能使用self直到所有(非可選)類屬性已被初始化超類的初始化有被調用(如果該類是繼承的)。

如果初始化屬性內聯,就像這樣:

let settingsForm = XLFormDescriptor(title: self.name()) 

你明確地使用self類的實例已正確初始化之前 - 這是編譯錯誤的原因。

您發現自己的解決方案不是解決方法,而是正確的解決方法。您首先使用不引用self的值初始化屬性,然後等待類初始化後,爲該屬性分配一個新值。

請注意,只有在允許您將新值分配給不可變屬性的情況下,只要這是在初始化程序中完成的情況下,這是唯一的情況。

爲了更好地瞭解初始化如何工作,我推薦閱讀相應的文檔:Initialization