Swift 3:围绕未打开的可选项的括号的含义

时间:2016-12-01 01:12:11

标签: swift optional

我注意到当我在Swift中编码时,当我使用选项时,我经常从编译器中获得自动更正,我试图理解这背后的意义。当我有一个可选的变量并且我尝试使用而不打开它时,我经常从Xcode获得(?)!自动更正。

在我的代码中,我有一个可选属性,它将是我UITableView的数据源集合:

var procedures: [Procedure]?

首先我会尝试使用它:

enter image description here

编译器告诉我,我需要为?使用self.procedures语法后缀。

enter image description here

所以我点击了一个小小的红色圆圈,然后让我自动更正:

enter image description here

但现在编译器仍在抱怨。关于你的要求?好吧,它显然希望self.procedures?.[indexPath.row]括在括号中,最后是! bang运算符......

所以我再次点击小红圈并让它自动纠正如下:

enter image description here

现在编译器很开心,但我不是。为什么我不高兴你问?因为我不明白()括号在这里做了什么。

有人可以解释一下吗?

1 个答案:

答案 0 :(得分:0)

正如您所看到的,您宣布您的程序是可选的

var procedures: [Procedure]?

然后您尝试将其传递给将接受过程

的函数
cell.configureWithProcedure(procedure: Procedure)

然后,您尝试使用索引来访问您的过程

self.procedures[indexpath.row]

这会导致错误,因为self.procedures是可选的,所以您需要打开它,然后尝试添加?

self.procedures?[indexpath.row]

这将解决问题,但结果不是正常Procedure,而是可选程序 - > Procedure?
所以XCode会给你一个打开它的提示,因为你的configureWithProcedure要求Procedure而不是Procedure?在一行中将会像这样写

(self.procedures?[indexPath.row])!

此操作将导致解包过程,但我不建议您使用!运算符,因为它很危险,所以我建议你这样做

if let procedure = self.procedures?[indexPath.row] {
    cell.configureWithProcedure(procedure: procedure)
}

编辑:

在你的情况下,如果程序不存在,你可以返回一个空单元格

extension UITableViewCell {
    dynamic class func emptyCell() -> UITableViewCell {
        let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
        cell.selectionStyle = UITableViewCellSelectionStyle.None
        return cell
    }
}

并像这样写

if let procedure = self.procedures?[indexPath.row] {
    cell.configureWithProcedure(procedure: procedure)
} else {
    return UITableView.emptyCell()
}

甚至更好地使用后卫

guard let procedure = self.procedures?[indexPath.row] else {
   return UITableView.emptyCell()
}
cell.configureWithProcedure(procedure: procedure)

希望我的回答可以帮助你!