它显示 "required initializer init must be provided in subclass of UIControl" 当我覆盖 init(frame: CGRect)
It shows "required initializer init must be provided in subclass of UIControl" When I override init(frame: CGRect)
此代码有效:
import UIKit
class wheel: UIControl {
}
但是这段代码没有:
class wheel: UIControl {
override init(frame: CGRect) {
super.init(frame: frame)
}
当我重写 init(frame : CGRect) 但不是 init(coder aDecoder: NSCoder)
.
为什么我必须实施 init(coder aDecoder: NSCoder)
?如果我没有实施,为什么我不需要实施它init(frame: CGRect)
?
我发现了一个类似的 Stack Overflow post 但它没有解释:
看。根据 Apple documentations Swift subclasses 默认不继承它们的 superclass 初始值设定项。它们只在某些情况下被继承,其中之一是:如果你的 subclass 没有定义任何指定的初始化器,它会自动继承它所有的 superclass 指定的初始化器。所以如果你没有实现 init(frame: CGRect)
,所有的超级初始化器都会被继承。
另外 UIView 采用了 NSCoding 协议,这需要一个 init(coder:)
初始化器。因此,如果您正在实施 init(frame: CGRect)
,您的 class 将不再继承超级初始化程序。所以你也必须实施那个:
required init?(coder decoder: NSCoder) {
super.init?(coder: decoder)
}
创建模型对象子classes 时,有时您可能希望添加自己的自定义初始化方法以增加便利性。
由于 Swift 内省的一些现有限制,这些方法不能指定为 class 的初始值设定项。相反,需要使用同名的 Swift 关键字 like this
将它们标记为便利初始值设定项
此代码有效:
import UIKit
class wheel: UIControl {
}
但是这段代码没有:
class wheel: UIControl {
override init(frame: CGRect) {
super.init(frame: frame)
}
当我重写 init(frame : CGRect) 但不是 init(coder aDecoder: NSCoder)
.
为什么我必须实施 init(coder aDecoder: NSCoder)
?如果我没有实施,为什么我不需要实施它init(frame: CGRect)
?
我发现了一个类似的 Stack Overflow post 但它没有解释:
看。根据 Apple documentations Swift subclasses 默认不继承它们的 superclass 初始值设定项。它们只在某些情况下被继承,其中之一是:如果你的 subclass 没有定义任何指定的初始化器,它会自动继承它所有的 superclass 指定的初始化器。所以如果你没有实现 init(frame: CGRect)
,所有的超级初始化器都会被继承。
另外 UIView 采用了 NSCoding 协议,这需要一个 init(coder:)
初始化器。因此,如果您正在实施 init(frame: CGRect)
,您的 class 将不再继承超级初始化程序。所以你也必须实施那个:
required init?(coder decoder: NSCoder) {
super.init?(coder: decoder)
}
创建模型对象子classes 时,有时您可能希望添加自己的自定义初始化方法以增加便利性。
由于 Swift 内省的一些现有限制,这些方法不能指定为 class 的初始值设定项。相反,需要使用同名的 Swift 关键字 like this
将它们标记为便利初始值设定项