如何更好地理解可选项

How to better understand optionals

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
    if (segue.identifier == "segueone")
    {
        let cellIndexPath = self.tableView!.indexPathForCell(sender as UITableViewCell)
        if  let unwrappedCellindexPath = cellIndexPath
        {
            var nextVC = (segue.destinationViewController as TableTwo)
            nextVC.items = items[unwrappedCellindexPath.row]
        }
    }
}

对于这段代码,我有几个关于可选值的问题。我最近通读了 apple developer web document 以及一些个人对 optionals 的解释,但仍然有疑问。

无论如何,

  1. let cellIndexPath = self.tableView!.indexPathForCell(sender as UITableViewCell)
    

    是否因为用户不能 select 我的 table 中的某个单元格而将此语句视为可选语句?有了这个,因为我知道只要用户想继续使用应用程序,他们就必须 select 一个单元格,我可以放置感叹号来通知编译器这个单元格确实有一个值(索引路径)?

  2. 为什么感叹号在"self.tableview"之后,而不是在括号中的“sender as UITableView)之后?

  3. 如果我的假设是正确的,我可以使用 if let 语法,因为我在前一行代码中有一个可选的?

  1. self.tableView 和 indexPathForCell() 都是可选的。通过敲击一个,您在结果中只有一个可选的取消引用。 sender 也是一个可选的,indexPathForCell() 不采用可选的,所以它可能也需要一个 bang,但我还没有编译它所以我不能确定编译器会做什么。

  2. self.tableView 是对可能未设置的 属性 的引用(例如为 nil),因此它是可选的。您可以声明它,例如带有 !最后,如果你知道它总是会被定义,比如从情节提要中定义,那么你以后就不必取消引用它了。

常见的做法是:

@IBOutlet var tableView : UITableView!

这是一个隐式展开的可选项,如果在 nil 时引用它会产生错误。但是你不需要使用!取消引用。

  1. 正确。该行的结果将产生一个可选的,您可以使用 if let
  2. 进行测试
let cellIndexPath = self.tableView!.indexPathForCell(sender as UITableViewCell)

tableView后加感叹号,因为可能没有设置self.tableView!(可能是nil)。

它是可选的,因为它有选项有一个值,而且它还有选项nil.非可选变量不能是 nil,它们必须有一个值。

感叹号在 tableView 之后,因为那是可选的,可能是 nil。如果它在 .indexPathForCell(sender as UITableViewCell) 之后,则意味着值 returned 可能为 nil。

您可以使用 if let 语法,因为这是可选的。如果可以将值分配给变量,这将 return 为真。例如:

var myNilValue: String?
if(let nonNilValue = myNilValue){
    //this will not be called
}

if let 将 return 为假,但是:

var myNonNilValue: String? = "Hello, World!"
if(let nonNilValue = myNilValue){
    //this will be called
}

将 return 正确。

变量声明后使用问号?来定义变量可能没有值,并且可能永远没有值。它们需要在变量名后使用感叹号 ! 来解包。这可以用于数据库中的结果,以防没有结果。

感叹号!用于变量声明之后,定义变量可能没有值,但当你需要访问它时它会有值 .它们不需要解包,但如果变量在访问时为 nil,编译器将抛出错误。这通常用于 @IBOutlets@IBActions 中,直到程序编译

才定义