gpt4 book ai didi

ios - 为什么我可以在没有参数的情况下初始化 UIView,但它的文档没有空的初始化程序?

转载 作者:搜寻专家 更新时间:2023-10-30 22:00:43 25 4
gpt4 key购买 nike

let view = UIView()

当唯一记录的 UIView 初始化程序是 init(frame: CGRect) 时,为什么编译没有错误?

具体来说,我正在尝试编写一个继承自 UIView 的新类,但这段代码会引发错误:

class SquadHorizontalScrollViewCell: UIView {

init(var: FIRDataSnapshot){
super.init()
....

它说它必须调用指定的初始化程序。

最佳答案

UIView 继承自UIResponderUIResponder 继承自NSObject

NSObject.init() initializer可以在 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 ,如果以编程方式实例化,init(frame:) 是指定的初始化程序,否则 init() 是指定的初始化程序。这意味着 UIView 继承了 NSObject 指定的初始化器,而不是像上面的示例那样替换它。

在你的例子中:

class SquadHorizontalScrollViewCell: UIView {

init(var: FIRDataSnapshot){
super.init()

我们看到指定的初始化器是init(frame: CGRect),所以你必须调用这个指定的初始化器。

关于ios - 为什么我可以在没有参数的情况下初始化 UIView,但它的文档没有空的初始化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39952355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com