如何更好地理解选项

时间:2015-03-31 04:01:44

标签: ios swift optional

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]
        }
    }
}

使用这段代码,我对选项有几个问题。我最近阅读了苹果开发者网站文档以及一些关于选项的个人解释,但仍有疑问。

反正,

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

    此语句是否仅被视为可选语句,因为用户可能无法选择表格中的一个单元格?有了它,因为我知道只要用户想要继续通过应用程序,他们必须选择一个单元格,我可以放置感叹号以通知编译器该单元格在行为中有一个值(索引路径)

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

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

2 个答案:

答案 0 :(得分:0)

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

  2. self.tableView是对可能尚未设置的属性的引用(例如,为nil),因此它是可选的。你可以用例如@IBOutlet来声明它!最后,如果你知道它总是被定义,比如来自故事板,那么你以后就不必再取消引用它了。

  3. 常见的事情是:

    @IBOutlet var tableView : UITableView!
    

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

    1. 正确。该行的结果将生成一个可选项,您可以使用if
    2. 进行测试

答案 1 :(得分:0)

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

tableView之后使用感叹号,因为self.tableView!可能尚未设置(可能是nil)。

它是可选的,因为它具有选项以获得值,并且选项也是nil。非选项的变量不能为nil,它们必须具有值。

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

由于此可选项,您可以使用if let语法。如果可以将值赋给变量,则返回true。例如:

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

if let将返回false,但是:

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

将返回true。

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

变量声明后使用感叹号!来定义变量可能没有值,但是当您需要访问它时它会有一个值。它们不需要打开,但如果变量在访问时为nil,编译器将抛出错误。这通常用于@IBOutlets@IBActions,在程序编译之前未定义