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调用初始化,这是预期的解释如下:Error in Swift class: Property not initialized at super.init call.
Swift’s compiler performs four helpful safety-checks to make sure that two-phase initialization is completed without error
Safety check 1 A designated initializer must ensure that all of the “properties introduced by its class are initialized before it delegates up to a superclass initializer.
Excerpt From: Apple Inc. “The Swift Programming Language.” iBooks. 07001
所以我的问题是:
如果swift类中的实例变量需要在这里像ASDataSource类型变量一样初始化自引用,我该怎么做?
由于swift不允许我在初始化所有实例变量之前调用super.init()而且在调用super.init()之前也不允许我在init()中的初始化程序中使用self.
目前我正在使用可选变量来解决问题.但出于学习目的,我想知道如何做到这一点.提前致谢 :)
required init(coder aDecoder: NSCoder) {
self.datasourceOfflineVideos = ASDataSource(tableViewController: self)
self.datasourceOnlineVideos = ASDataSource(tableViewController: self)
super.init(coder: aDecoder)
}
首先是实例属性,然后可以调用超类初始值设定项.但在你的情况下这是不可能的,因为你引用的是自我.
这种情况下的解决方法是使属性隐式解包选项:
var datasourceOnlineVideos:ASDataSource!
var datasourceOfflineVideos:ASDataSource!
由于不需要初始化选项,因此可以在调用super.init方法后安全地初始化它们.隐式展开,您可以将它们用作任何其他非可选属性.
Apple在几个类中使用此模式,包括UIViewController:当您从IB添加插座时,组件属性始终声明为隐式解包.这是因为控件本身并没有在初始化程序中实例化,而是在稍后阶段.
相关文章
- 属性 - Swift类中的错误:属性未在super.init调用初始化
- swift - '在super.init初始化self之前在方法调用中使用self',不能通过方法调用初始化属性
- ios - Swift Class中的自定义init,在“隐式生成的super.init调用”错误中“未初始化属性”?
- ios - Swift中的错误:属性'self.circle1'在super.init调用时没有初始化?
- ios - 属性'self.title'未在swift 中的super.init调用中初始化
- ios - 属性'self.*'未在super.init调用中初始化
- ios - 在super.init初始化self之前,在属性访问'frame'中使用'self'
- ios - Swift:在super.init中的方法调用中使用'self'初始化自编译错误
转载注明原文:ios – Swift类中的错误:在super.init调用中未初始化的属性 – 如何在其初始化参数中初始化需要使用self的属性 - 代码日志