ios – Swift类中的错误:在super.init调用中未初始化的属性 – 如何在其初始化参数中初始化需要使用self的属性

我在swift中覆盖了一个UITableViewController,其中我有两个必需的变量,这些变量通过使用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
  }

现在的问题是它给了我错误属性没有在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.

目前我正在使用可选变量来解决问题.但出于学习目的,我想知道如何做到这一点.提前致谢 :)

最佳答案
您只需要在初始化程序中反转订单super.init / properties:

 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添加插座时,组件属性始终声明为隐式解包.这是因为控件本身并没有在初始化程序中实例化,而是在稍后阶段.

转载注明原文:ios – Swift类中的错误:在super.init调用中未初始化的属性 – 如何在其初始化参数中初始化需要使用self的属性 - 代码日志