我UITableViewController快速覆盖了其中的两个必需变量,这些变量通过使用weak引用进行初始化,self因为这些变量用于实现UITableViewDataSource协议,并且需要self引用以使用其tableView属性
UITableViewController
weak
self
UITableViewDataSource
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 }
现在的问题是,它给了我Property not initialized at super.initcall预期的错误
Property not initialized at super.initcall
Swift的编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误 安全检查1指定的初始化程序在将其委托给超类初始化程序之前,必须确保初始化其类引入的所有属性。 摘录自:苹果公司“ The Swift Programming Language”。iBooks。https://itunes.apple.com/cn/book/swift-programming- language/id881256329?mt=11
Swift的编译器执行四项有用的安全检查,以确保两阶段初始化完成且没有错误
安全检查1指定的初始化程序在将其委托给超类初始化程序之前,必须确保初始化其类引入的所有属性。
摘录自:苹果公司“ The Swift Programming Language”。iBooks。https://itunes.apple.com/cn/book/swift-programming- language/id881256329?mt=11
所以我的问题是:
如果swift类中的实例变量需要self像ASDataSource这里的类型变量一样初始化引用,我该怎么做?
ASDataSource
由于swift不允许我super.init()在初始化所有实例变量之前调用,并且也不允许我在调用之前self在初始化器中使用init()``super.init()
super.init()
init()``super.init()
目前,我正在使用可选变量来解决此问题。但是出于学习目的,我想知道如何去做。提前致谢 :)
您只需要在初始值设定项中反转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!
由于不需要初始化可选参数,因此可以super.init在调用方法后安全地对其进行初始化。被隐式展开时,可以将它们用作其他任何非可选属性。
super.init
Apple在多个类中使用了这种模式,包括UIViewController:当您从IB添加插座时,组件属性始终被声明为隐式展开。这是因为控件本身不是在初始化程序中实例化的,而是在以后的阶段中实例化的。
UIViewController