Kev*_*lia 13 init instance-variables 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()
}
}
Run Code Online (Sandbox Code Playgroud)
现在问题是我在初始化类内部属性之前不能调用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()
}
Run Code Online (Sandbox Code Playgroud)
和
override init (frame : CGRect) {
self.collectionView = UICollectionView()
super.init(frame : frame)
}
Run Code Online (Sandbox Code Playgroud)
Ale*_*kov 23
表格文件:
Swift的编译器执行四个有用的安全检查,以确保完成两阶段初始化而不会出现错误:
安全检查1指定的初始化程序必须确保在委托一个超类初始化程序之前初始化其类引入的所有属性.
在调用super.init()之前,需要为实例变量设置值.在此操作之后,您将访问调用实例方法.在你的情况下,你可以这样做:
override init (frame : CGRect) {
self.collectionView = UICollectionView()
super.init(frame : frame)
// Now you can call method
self.someMethod()
}
Run Code Online (Sandbox Code Playgroud)
ADD for question's EDIT:
super.init()
出于安全原因,您无法在呼叫前呼叫方法.如果你这样做,那么你的方法可以使用一些尚未在父类中初始化的属性
归档时间: |
|
查看次数: |
14556 次 |
最近记录: |