它显示“必须在UIControl的子类中提供必需的初始化程序初始化”当我重写init(frame:CGRect)时

时间:2016-04-08 14:32:17

标签: ios swift initialization override initializer

此代码有效:

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'

2 个答案:

答案 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关键字将它们标记为便捷初始化程序。