let view = UIView()
为什么当唯一记录的时候编译没有错误UIView
初始化器是init(frame: CGRect)
?
具体来说,我正在尝试编写一个继承自的新类UIView
,但是这段代码会抛出一个错误:
class SquadHorizontalScrollViewCell: UIView {
init(var: FIRDataSnapshot){
super.init()
....
它说它必须调用指定的初始化程序。
UIView
继承自UIResponder
它继承自NSObject
.
The NSObject.init()
初始化器 https://developer.apple.com/documentation/objectivec/nsobject/1418641-init可以访问UIView
,但不是在子类上NSObject
它取代了这个指定的初始值设定项。
让我们考虑一个例子。
class A: NSObject {
init(_ string: String) { }
}
这会导致编译器错误let a = A()
- 初始化程序缺少参数#1,因为该初始化程序替换了指定的init()
初始化程序NSObject
在子类中。
您只需将子类的初始值设定项定义为convenience
初始化器:
class A: NSObject {
convenience init(_ string: String) {
self.init() // Convenience initializers must call a designated initializer.
}
}
let a = A()
现在编译。
UIView
还可以使用子类中定义的其他指定初始值设定项进行编译,因为其指定初始值设定项在编译时未知。根据docs https://developer.apple.com/documentation/uikit/uiview/1622488-init,如果以编程方式实例化,init(frame:)
是指定的初始值设定项,否则init()
是指定的初始值设定项。这意味着UIView
继承了NSObject
指定初始值设定项而不是像上面的示例中那样替换它。
在你的例子中:
class SquadHorizontalScrollViewCell: UIView {
init(var: FIRDataSnapshot){
super.init()
我们看到指定的初始化器是init(frame: CGRect)
,所以你必须调用这个指定的初始值设定项。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)