此代码有效:
import UIKit
class wheel: UIControl {
}
但是这段代码没有:
class wheel: UIControl {
override init(frame: CGRect) {
super.init(frame: frame)
}
当我覆盖init(frame:CGRect)而不是{{1>时,显示错误“必须在UIControl
的子类中提供初始值设定项初始化}}
为什么我必须实施init(coder aDecoder: NSCoder)
?如果我没有实现init(coder aDecoder: NSCoder)
?
我发现了一个类似的Stack Overflow帖子,但没有解释: Swift : Error: 'required' initializer 'init(coder:)' must be provided by subclass of 'UIView'
答案 0 :(得分:11)
看。根据{{3}} Swift子类默认不继承其超类初始值设定项。它们仅在某些情况下继承,其中之一是:如果您的子类未定义任何指定的初始值设定项,则它会自动继承其所有超类指定的初始值设定项。因此,如果您没有实现init(frame: CGRect)
,则继承所有超级初始值设定项。
UIView也采用NSCoding协议,需要init(coder:)
初始值设定项。因此,如果您正在实施init(frame: CGRect)
,则您的类不再继承超级初始值设定项。所以你也必须实现那个:
required init?(coder decoder: NSCoder) {
super.init?(coder: decoder)
}
答案 1 :(得分:0)
在创建模型对象子类时,有时可能需要添加自己的自定义初始化方法,以提供更多便利。
由于Swift自省的某些当前限制,无法将这些方法指定为该类的初始化程序。相反,需要使用同名like this
的Swift关键字将它们标记为便捷初始化程序。