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

'Use of self in method call before super.init initializes self', can't init properties through a method call

我很好奇是否可以在您的 init 方法中调用一个方法来设置 class 的实例属性。本质上我只有一个 class 子 classes UIView,在 init 中添加了一些子视图,其中一些子视图是 class.

的实例变量
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()

    }
}

现在问题来了,我无法在初始化 classes 内部属性之前调用 super init(属性 '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() 调用之前调用方法。如果你愿意这样做,那么你的方法可以使用一些尚未在父 class

中初始化的属性