在使用大量初始化工具覆蓋的子類中使用常量是很乏味的。看看下面的類,我需要在兩個初始化器中複製代碼。使用常量時的常見初始化
class Test : UIView {
let subview: UIView
override init(frame: CGRect) {
subview = UIView() // once
super.init(frame: frame)
}
required init(coder aDecoder: NSCoder) {
subview = UIView() // twice
super.init(coder: aDecoder)
}
}
如果我試圖用一個共同的初始化的話,我得到以下錯誤(見註釋)
override init(frame: CGRect) {
commonInit() // 1: Use of 'self' in method call 'commonInit' before super.init initializes self
super.init(frame: frame) // 2: Property 'self.subview' is not in initialized at super.init call
}
private func commonInit() {
subview = UIView() // 3: Cannot assign to 'subview' in 'self'
}
它工作正常,如果我不使用一個常數,這樣定義子視圖:在初始化
var subview: UIView?
然後當然開關順序是這樣的:
super.init(frame: frame)
commonInit()
所以我的問題是:有沒有辦法使用常用的常量初始化Swift中的常量?
編輯:我完全忘了提的是,這裏的鬥爭,我不能啓動子視圖之前,我在init是,它是基於聲明的常量時不知道數據開始。
重複http://stackoverflow.com/questions/的24023412/how-to-implement -inits-with-same-content-without-code-duplicate-in-swift? –
不,正如我所說我知道如何爲var做這個,我使用let – Johannes
請參閱下面的答案。它允許您根據上下文正確地初始化值。 –