'在super.init初始化self'之前在方法调用中使用self,不能通过方法调用

时间:2015-11-17 19:32:39

标签: swift instance-variables init

我很好奇是无论如何都要在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(属性'self.collectionView'在super.init调用时没有被初始化),但是我也无法调用我的自定义方法来初始化那些super.init之前的变量,因为它不能在初始化之前使用self。我意识到我可以使实例变量可选,但它似乎不太优雅,因为我知道它将始终被初始化(还有更多,这只是一个简化版本)。有没有办法在不制作所有实例变量选项的情况下实现这一目标?

编辑:

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

1 个答案:

答案 0 :(得分:22)

表格文件:

  

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

     

安全检查1 指定的初始化程序必须确保所有的   其类引入的属性在委托之前初始化   一个超类初始化器。

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

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

ADD for question's EDIT:

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