错误在Swift类:属性没有在super.init调用初始化 – 如何初始化需要使用self在他们的初始化参数

我重写了一个UITableViewController在Swift中,其中我有两个必需的variables,这是通过使用selfweak引用初始化,因为这些是用来实现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 } 

现在的问题是因为它给了我错误Property not initialized at super.init call这是预期的解释在这里: Swift类错误:属性没有在super.init调用初始化 。

Swift的编译器执行四个有用的安全检查,以确保两阶段初始化完成没有错误

安全检查1指定的初始化程序必须确保所有由其类引入的属性在委托给一个超类初始化程序之前进行初始化。

摘录自:苹果公司“Swift编程语言”,iBooks。 https://itunes.apple.com/us/book/swift-programming-language/id881256329?mt=11

所以我的问题是:

如果一个ASDataSource类中的实例variables需要self引用来初始化像ASDataSourcetypes的variables,那我该怎么做?

由于swift不允许我在初始化所有实例variables之前调用super.init()在调用super.init()之前也不允许我在init()的初始化程序中使用self

目前我正在使用可选variables来解决问题。 但为了学习的目的,我想知道如何做到这一点。 提前致谢 :)

你只需要在你的初始化器里反转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方法被调用之后安全地初始化它们。 被隐式地解开,你使用它们作为任何其他非可选属性。

Apple在几个类中使用了这种模式,包括UIViewController :当您从IB添加一个sockets时,组件属性总是被声明为隐式解包。 这是因为控制器本身没有在初始化器中实例化,而是在稍后的阶段。