Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift类错误:在super.init调用时未初始化属性-如何初始化需要在其初始值设定项参数中使用self的属性_Ios_Swift_Properties_Compiler Errors_Initialization - Fatal编程技术网

Ios Swift类错误:在super.init调用时未初始化属性-如何初始化需要在其初始值设定项参数中使用self的属性

Ios Swift类错误:在super.init调用时未初始化属性-如何初始化需要在其初始值设定项参数中使用self的属性,ios,swift,properties,compiler-errors,initialization,Ios,Swift,Properties,Compiler Errors,Initialization,我在swift中重写一个UITableViewController,其中我有两个必需的变量,通过使用self的weak引用进行初始化,因为这些变量用于实现UITableViewDataSource协议,并且需要self引用来使用其tableView属性 class VideosListViewController: UITableViewController { required init(coder aDecoder: NSCoder) { super.init(coder:

我在swift中重写一个
UITableViewController
,其中我有两个必需的变量,通过使用
self
weak
引用进行初始化,因为这些变量用于实现
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
  }
现在的问题是,它给了我错误
属性未在super.init调用中初始化
,如这里所述:

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

安全检查1指定的初始值设定项必须确保其类引入的所有“属性”在委托给超类初始值设定项之前都已初始化

摘自:苹果公司《Swift编程语言》。iBooks

所以我的问题是:

如果swift类中的实例变量需要
self
引用进行初始化,就像这里的
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)
  }
首先是实例属性,然后可以调用超类初始值设定项。但在您的情况下,这是不可能的,因为您正在引用
self

这种情况下的解决方法是使属性隐式展开选项:

var datasourceOnlineVideos:ASDataSource!
var datasourceOfflineVideos:ASDataSource!
由于optionals不需要初始化,因此可以在调用
super.init
方法后安全地初始化它们。隐式展开后,可以将它们用作任何其他非可选属性

Apple在几个类中使用此模式,包括
UIViewController
:当您从IB添加插座时,组件属性始终声明为隐式展开。这是因为控件本身不是在初始值设定项中实例化的,而是在稍后的阶段。

谢谢。这对我来说很有效:)还有一件事:在这个cas中我们需要在初始化数据源变量之前调用super.init。