我想使用 let
设置一个变量,这样它就不是可选的,不会随着时间的推移而改变,也不需要每次都进行困惑的解包来访问。我知道我可以合法地设置它,但只能在 init
方法之一中进行。问题是 Swift 要求您覆盖 init(coder aDecoder: NSCoder)
初始化程序。但是,我从来没有一个应用程序调用过该初始化程序。它总是调用 init(frame: CGRect)
初始化程序。因此,如果我不必重写 init(coder aDecoder: NSCoder)
,那么我只需在 中执行
我已经完成了,但是编译器提示它也没有在另一个 init 中设置。我尝试制作一个从两个初始化调用的 self.imageView = UIImageView.new()
init(frame: CGRect)sharedInit()
方法,但编译器不允许我从那里设置 imageView
,因为它只在初始化之外读取方法。如果不直接在 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
}
}
最佳答案
我找到了 this answer 并喜欢它的方法。它解决了这个问题,并且更干净恕我直言。通过实现 init(coder aDecoder: NSCoder)
通常我们会保持这样的外观,即这个 View 可以从 nib/storyboard 初始化,但它不能。
class SuperCoolView : UIView {
let imageView: UIImageView
required init(coder aDecoder: NSCoder) {
fatalError("NSCoding not supported")
}
override init(frame: CGRect) {
self.imageView = UIImageView.new()
// Other stuff
super.init(frame: frame)
}
关于ios - 如何使用共享初始化方法初始化 let 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29111874/