我很好奇是否可以在设置类实例属性的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指定的初始值设定项在将其委托给超类初始值设定项之前,必须确保初始化其类引入的所有属性。
您需要在调用super.init()之前为实例变量设置值,并且在执行此操作之后,您将可以访问调用实例方法。在您的情况下,您可以执行以下操作:
override init (frame : CGRect) {
self.collectionView = UICollectionView()
super.init(frame : frame)
// Now you can call method
self.someMethod()
}
添加问题的编辑:
super.init()
出于安全原因,您不能在调用前调用方法。如果您要这样做,则您的方法可以使用一些尚未在父类中初始化的属性
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句