繁体   English   中英

在初始化之前使用的变量

[英]variable used before being initialized

我有这个问题

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let destViewController = segue.destinationViewController as! SecondTableViewController
    var secondArrays :  SecondTableData

    if let indexPath = self.tableView.indexPathForSelectedRow {
        secondArrays = secondArrayData[indexPath.row]
    }
    destViewController.secondArray = secondArrays.secondTitle    
}

我在线上有错误

destViewController.secondArray = secondArrays.secondTitle

初始化之前使用的secondArrays

为什么我会收到这个错误? 请帮忙,只是Swift的新手。 TIA

这是因为在Swift中初始化变量的方式,在Swift Class中,每个属性在使用之前都需要一些默认值。

Swift中的类初始化是一个两阶段过程。 在第一阶段,每个存储的属性都由引入它的类分配初始值。 一旦确定了每个存储属性的初始状态,第二阶段就开始了,并且每个类都有机会在新实例被认为可以使用之前进一步定制其存储的属性。

尝试更改您的代码,如下所示:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
  let destViewController = segue.destinationViewController as! SecondTableViewController
  var secondArrays :  SecondTableData?

  if let indexPath = self.tableView.indexPathForSelectedRow {
    secondArrays = secondArrayData[indexPath.row]

    //Here you're making sure that the secondArrays would must have a value
    destViewController.secondArray = secondArrays.secondTitle
  }

}

您将secondArrays错误,因为如果您的if let失败,则可以在没有任何初始化的情况下使用secondArrays

尝试以下逻辑:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
  let destViewController = segue.destinationViewController as! SecondTableViewController
  guard let indexPath = self.tableView.indexPathForSelectedRow else { return }

  destViewController.secondArray = secondArrayData[indexPath.row].secondTitle
}

你可以将secondArrays的类型更改为隐式解包的可选( SecondTableData! ),这应该摆脱构建时错误。 请注意,如果未初始化变量并且您尝试访问它,则会引发运行时错误

同样,如果你改变了变量为let这个方法是行不通的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM