一尘不染

“在super.init初始化自身之前在方法调用中使用self”,无法通过方法调用来初始化属性

swift

我很好奇,无论如何在init方法内部调用一个用于设置类实例属性的方法。本质上,我只是有一个类来对UIView进行子类化,并在init中添加了一些子视图,而其中一些子视图是该类的实例变量。

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(在super.init调用时未初始化属性’self.collectionView’),但是在调用之前,我也无法调用自定义方法来初始化这些变量super.init,因为它不能在初始化之前使用self。我意识到我可以将实例变量设置为可选,但是看起来不太优雅,因为我知道它将始终被初始化(还有更多实例,这只是简化版本)。有没有什么方法可以使我的所有实例变量都为可选变量呢?

编辑:

我认为最终我的问题是,为什么在调用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)
}

阅读 258

收藏
2020-07-07

共1个答案

一尘不染

表格文件:

Swift的编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误:

安全检查1 指定的初始值设定项在将其委托给超类初始值设定项之前,必须确保初始化其类引入的所有属性。

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

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

添加问题的编辑:

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

2020-07-07