iMe*_*mon 6 compiler-errors initialization properties ios swift
我正在重写UITableViewControllerswift,其中我有两个必需的变量,这些变量通过使用weak引用来初始化,self因为这些变量用于实现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
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是因为它给出了我Property not initialized at super.init call预期的错误,如下所述:Swift类中的错误:属性未在super.init调用时初始化.
Swift的编译器执行四个有用的安全检查,以确保完成两阶段初始化而没有错误
安全检查1指定的初始化程序必须确保在委托最高级初始化程序之前初始化其类引入的所有属性.
摘录自:Apple Inc."The Swift Programming Language."iBooks.https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11
所以我的问题是:
如果swift类中的实例变量需要self引用像ASDataSource类型变量一样初始化,我该怎么做?
由于swift不允许我调用super.init()之前初始化所有实例变量而且也不允许我在调用之前self在初始化程序中使用init()super.init()
目前我正在使用可选变量来解决问题.但出于学习目的,我想知道如何做到这一点.提前致谢 :)
Ant*_*nio 11
您只需要在初始化程序中反转订单super.init/properties:
required init(coder aDecoder: NSCoder) {
self.datasourceOfflineVideos = ASDataSource(tableViewController: self)
self.datasourceOnlineVideos = ASDataSource(tableViewController: self)
super.init(coder: aDecoder)
}
Run Code Online (Sandbox Code Playgroud)
首先是实例属性,然后可以调用超类初始值设定项.但是在你的情况下这是不可能的,因为你正在引用self.
这种情况下的解决方法是使属性隐式解包选项:
var datasourceOnlineVideos:ASDataSource!
var datasourceOfflineVideos:ASDataSource!
Run Code Online (Sandbox Code Playgroud)
由于不需要初始化选项,因此可以super.init在调用方法后安全地初始化它们.隐式展开,您可以将它们用作任何其他非可选属性.
Apple在几个类中使用此模式,包括UIViewController:当您从IB添加插座时,组件属性始终声明为隐式解包.这是因为控件本身并没有在初始化程序中实例化,而是在稍后阶段.
| 归档时间: |
|
| 查看次数: |
4988 次 |
| 最近记录: |