我很好奇,无论如何在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) }
表格文件:
Swift的编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误: 安全检查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()出于安全原因,您不能在调用前调用方法。如果您要这样做,则您的方法可以使用一些尚未在父类中初始化的属性
super.init()