Ios Swift类错误:在super.init调用时未初始化属性-如何初始化需要在其初始值设定项参数中使用self的属性
我在swift中重写一个Ios Swift类错误:在super.init调用时未初始化属性-如何初始化需要在其初始值设定项参数中使用self的属性,ios,swift,properties,compiler-errors,initialization,Ios,Swift,Properties,Compiler Errors,Initialization,我在swift中重写一个UITableViewController,其中我有两个必需的变量,通过使用self的weak引用进行初始化,因为这些变量用于实现UITableViewDataSource协议,并且需要self引用来使用其tableView属性 class VideosListViewController: UITableViewController { required init(coder aDecoder: NSCoder) { super.init(coder:
UITableViewController
,其中我有两个必需的变量,通过使用self
的weak
引用进行初始化,因为这些变量用于实现UITableViewDataSource
协议,并且需要self
引用来使用其tableView
属性
class VideosListViewController: UITableViewController {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.datasourceOfflineVideos = ASDataSource(tableViewController: self)
self.datasourceOnlineVideos = ASDataSource(tableViewController: self)
}
// MARK: - Variables
var datasourceOnlineVideos:ASDataSource
var datasourceOfflineVideos:ASDataSource
}
现在的问题是,它给了我错误属性未在super.init调用中初始化
,如这里所述:
Swift的编译器执行四项有用的安全检查,以确保两阶段初始化无误完成
安全检查1指定的初始值设定项必须确保其类引入的所有“属性”在委托给超类初始值设定项之前都已初始化
摘自:苹果公司《Swift编程语言》。iBooks
所以我的问题是:
如果swift类中的实例变量需要self
引用进行初始化,就像这里的ASDataSource
类型变量一样,我该怎么做呢???
因为swift不允许我在初始化所有实例变量之前调用super.init()
,也不允许我在调用super.init()
之前在init()
中的初始值设定项中使用self
目前我正在使用可选变量来解决此问题。但出于学习目的,我想知道如何执行此操作。提前感谢:)您只需在初始值设定项中反转super.init/properties的顺序即可:
required init(coder aDecoder: NSCoder) {
self.datasourceOfflineVideos = ASDataSource(tableViewController: self)
self.datasourceOnlineVideos = ASDataSource(tableViewController: self)
super.init(coder: aDecoder)
}
首先是实例属性,然后可以调用超类初始值设定项。但在您的情况下,这是不可能的,因为您正在引用self
这种情况下的解决方法是使属性隐式展开选项:
var datasourceOnlineVideos:ASDataSource!
var datasourceOfflineVideos:ASDataSource!
由于optionals不需要初始化,因此可以在调用super.init
方法后安全地初始化它们。隐式展开后,可以将它们用作任何其他非可选属性
Apple在几个类中使用此模式,包括UIViewController
:当您从IB添加插座时,组件属性始终声明为隐式展开。这是因为控件本身不是在初始值设定项中实例化的,而是在稍后的阶段。谢谢。这对我来说很有效:)还有一件事:在这个cas中我们需要在初始化数据源变量之前调用super.init。