【发布时间】:2015-03-18 21:13:15
【问题描述】:
我想使用let 设置一个变量,这样它就不是可选的,不会随着时间的推移而改变,也不需要每次都进行混乱的解包访问。我知道我可以合法地设置它,但只能在 init 方法之一内。问题是 Swift 要求你重写 init(coder aDecoder: NSCoder) 初始化器。但是,我从未有过调用该初始化程序的应用程序。它始终是被调用的 init(frame: CGRect) 初始化程序。因此,如果我不必覆盖init(coder aDecoder: NSCoder),那么我只需在init(frame: CGRect) 中执行self.imageView = UIImageView.new() 就可以了,但是编译器抱怨它也没有在另一个init 中设置。我尝试创建一个从两个 init 调用的 sharedInit() 方法,但是编译器不会让我从那里设置 imageView,因为它在 init 方法之外是只读的。如果不直接在 init 方法中执行所有 init 两次,您应该如何完成此操作?
class SuperCoolView : UIView {
let imageView: UIImageView
required init(coder aDecoder: NSCoder) {
sharedInit()
super.init(coder: aDecoder)
}
override init(frame: CGRect) {
sharedInit()
super.init(frame: frame)
}
func sharedInit() {
self.imageView = UIImageView.new()
// Other similar shared init
}
}
【问题讨论】:
-
Swift 1.2 解决了这个问题(你可以在任何地方设置 let 变量,但当然只能设置一次......)。
-
我在 Xcode 6.3b3 中执行此操作,所以我使用的是 Swift 1.2,但我遇到了错误。
-
How to implement two inits with same content without code duplication in Swift? 的可能重复项。请参阅this answer in particular - 您可以将基于闭包的属性初始化与
commonInit()函数结合使用。