我正在尝试向UIViewController
中的Swift
添加简单的初始化工具。到目前为止,它一直非常令人沮丧...
首先我尝试将其添加为便利初始化:
class ImageViewController: UIViewController {
var model: UIImage
convenience init(model: UIImage){
self.init(nibName: nil, bundle: nil)
self.model = model
}
....
如果我这样做,编译器会强制我实现所需的init(coder aDecoder: NSCoder)
。我检查了UIViewController
类的定义,并且没有这样的要求,但无论如何。
更糟糕的是,编译器抱怨self.init(nibName: nil, bundle: nil)
调用在bundle:
中有一个错误的额外参数。同样,我检查了类定义,初始化签名需要两个参数。
所以我决定把它变成一个指定的init。这不是我想要的,因为我不想失去所有超类初始化者。
现在它似乎对self.init(nibName: nil, bundle: nil)
电话感到满意,但它仍坚持我实施init(coder aDecoder: NSCoder)
。
关于发生了什么的任何想法?我不能对此做出正面或反面......
答案 0 :(得分:3)
错误信息确实令人困惑,但我认为它们来自于这一事实
如果model
属性没有默认值,则不再需要所需的初始值设定项
继承自超类。使用可选(或隐式展开的可选)属性
(具有默认值nil
)您的代码编译:
class ImageViewController: UIViewController {
var model: UIImage!
convenience init(model: UIImage) {
self.init(nibName: nil, bundle: nil)
self.model = model
}
}
答案 1 :(得分:1)
如果您不希望model
属性是可选的,请不要将其设为可选。当然,必须实施initWithCoder:
是一个婊子,但拥有坚如磐石的安全代码会更好。
class ImageViewController: UIViewController {
var model: UIImage
init(model: UIImage) {
self.model = model
super.init(nibName: nil, bundle: nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
这可确保创建ImageViewController
实例的唯一方法是调用initWithModel:
,从而保证model
始终具有非可选值。
也许将来,Apple会添加一种方便的方法来做到这一点,但就目前而言,我必须牺牲便利性来控制。