我注意到当我在Swift中编码时,当我使用选项时,我经常从编译器中获得自动更正,我试图理解这背后的意义。当我有一个可选的变量并且我尝试使用而不打开它时,我经常从Xcode获得(?)!
自动更正。
在我的代码中,我有一个可选属性,它将是我UITableView
的数据源集合:
var procedures: [Procedure]?
首先我会尝试使用它:
编译器告诉我,我需要为?
使用self.procedures
语法后缀。
所以我点击了一个小小的红色圆圈,然后让我自动更正:
但现在编译器仍在抱怨。关于你的要求?好吧,它显然希望self.procedures?.[indexPath.row]
括在括号中,最后是!
bang运算符......
所以我再次点击小红圈并让它自动纠正如下:
现在编译器很开心,但我不是。为什么我不高兴你问?因为我不明白()
括号在这里做了什么。
有人可以解释一下吗?
答案 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)
希望我的回答可以帮助你!