gpt4 book ai didi

swift - 'Use of self in method call before super.init initializes self',无法通过方法调用初始化属性

转载 作者:IT王子 更新时间:2023-10-29 05:23:16 25 4
gpt4 key购买 nike

我很好奇在您的 init 方法中是否有调用方法来设置类的实例属性。本质上我只是有一个子类 UIView 的类,在 init 中添加了一些 subview ,其中一些 subview 是该类的实例变量。

class MyView: UIView {
var collectionView: UICollectionView

convenience init () {
self.init(frame:CGRectZero)
}

override init (frame : CGRect) {
super.init(frame : frame)

addSubviews()
}

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)

addSubviews()
}

func addSubviews (){
self.collectionView = UICollectionView()

}
}

现在问题来了,我无法在初始化我的类内部属性之前调用 super init(Property 'self.collectionView' 未在 super.init 调用时初始化),但我也无法调用我的自定义方法来初始化这些super.init 之前的变量,因为它不能在初始化之前使用 self。我意识到我可以使实例变量可选,但它似乎不太优雅,因为我知道它总是会被初始化(还有更多,这只是一个简化版本)。有什么方法可以在不使我的所有实例变量都成为可选变量的情况下实现这一点?

编辑:

我认为最终我的问题是为什么 swift 不允许在调用 super.init 之前调用方法?有什么区别:

override init (frame : CGRect) {
addSubviews()
super.init(frame : frame)
}

final func addSubviews (){
self.collectionView = UICollectionView()
}

override init (frame : CGRect) {
self.collectionView = UICollectionView()
super.init(frame : frame)
}

最佳答案

表单文档:

Swift’s compiler performs four helpful safety-checks to make sure that two-phase initialization is completed without error:

Safety check 1 A designated initializer must ensure that all of the properties introduced by its class are initialized before it delegates up to a superclass initializer.

您需要在调用 super.init() 之前为实例变量设置值,此操作之后您将访问调用实例方法。在您的情况下,您可以这样做:

override init (frame : CGRect) {
self.collectionView = UICollectionView()
super.init(frame : frame)
// Now you can call method
self.someMethod()
}

添加问题的编辑:

出于安全原因,您不能在 super.init() 调用之前调用方法。如果你愿意这样做,那么你的方法可以使用一些尚未在父类中初始化的属性

关于swift - 'Use of self in method call before super.init initializes self',无法通过方法调用初始化属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33765485/

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