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

all*_*nli 3 overriding initialization initializer ios swift

此代码有效:

import UIKit

class wheel: UIControl {

}
Run Code Online (Sandbox Code Playgroud)

但是这段代码没有:

class wheel: UIControl {
override init(frame: CGRect) {
    super.init(frame: frame)
}
Run Code Online (Sandbox Code Playgroud)

当我覆盖init(frame:CGRect)但它没有显示错误" 必须在子类中提供所需的初始化程序初始化UIControl " init(coder aDecoder: NSCoder).

为什么我要实施init(coder aDecoder: NSCoder)?如果我没有实现,为什么我不需要实现init(frame: CGRect)呢?

我发现了一个类似的Stack Overflow帖子,但它没有解释: Swift:错误:'required'initulator'init(coder :)'必须由'UIView'的子类提供

iyu*_*una 13

看.根据Apple文档, Swift子类默认不继承其超类初始值设定项.它们仅在某些情况下继承,其中之一是:如果您的子类未定义任何指定的初始值设定项,则它会自动继承其所有超类指定的初始值设定项.因此,如果您没有实现init(frame: CGRect)所有超级初始化器都是继承的.

UIView也采用NSCoding协议,需要init(coder:)初始化器.因此,如果您正在实现init(frame: CGRect),您的类不再继承超级初始化器.所以你也必须实现那个:

required init?(coder decoder: NSCoder) {
    super.init?(coder: decoder)
}
Run Code Online (Sandbox Code Playgroud)

  • 好答案。但是代码示例应该说“ required init?”而不是“ init”。 (2认同)