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 初始化前使用的变量_Ios_Swift - Fatal编程技术网

Ios 初始化前使用的变量

Ios 初始化前使用的变量,ios,swift,Ios,Swift,我对此有点问题 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { let destViewController = segue.destinationViewController as! SecondTableViewController var secondArrays : SecondTableData if let indexPath = self.tabl

我对此有点问题

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
初始化之前使用的第二个数组


为什么我会犯这样的错误?请帮帮我,只是一个有斯威夫特的新手。TIA

您将出现错误,因为如果let失败,则可以在不进行任何初始化的情况下使用
secondarray

尝试以下逻辑:

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
}

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

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
  }

}

您可以将
secondarray
的类型更改为隐式展开的可选(
SecondTableData!
)类型,这样可以消除生成时错误。注意:如果变量未初始化,并且您尝试访问它,则会引发运行时错误


另外,如果您将变量更改为a
let
,此方法将不起作用。

您是否一步一步地运行它,它是否会进入if{}?如果
if let indexath=self.tableView.indexPathForSelectedRow
失败,则
secondArrays
仍将未初始化。因此,编译器给出了这个警告。可能是重复的,因为如果{}实际对象被分配给它,它可能不会进入内部,对吗?