在初始化之前使用的变量

时间:2016-03-07 04:08:08

标签: ios 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]
      }
      destViewController.secondArray = secondArrays.secondTitle

 }

我在destViewController.secondArray = secondArrays.secondTitle中遇到错误 它说:在初始化之前使用的secondArrays,为什么我得到那个错误?请帮助,只是一个swift的新手。 TIA

3 个答案:

答案 0 :(得分:10)

这是因为在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
  }

}

答案 1 :(得分:3)

如果secondArrays失败,您可能会在没有初始化的情况下使用if let,从而导致错误。

尝试以下逻辑:

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
}

答案 2 :(得分:1)

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

另外,如果您将变量更改为let,则此方法将无效。