在使用大量初始化工具覆盖的子类中使用常量是很乏味的。看看下面的类,我需要在两个初始化器中复制代码。使用常量时的常见初始化
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
请参阅下面的答案。它允许您根据上下文正确地初始化值。 –