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]
}
}
}
使用这段代码,我对选项有几个问题。我最近阅读了苹果开发者网站文档以及一些关于选项的个人解释,但仍有疑问。
反正,
行
let cellIndexPath = self.tableView!.indexPathForCell(sender as UITableViewCell)
此语句是否仅被视为可选语句,因为用户可能无法选择表格中的一个单元格?有了它,因为我知道只要用户想要继续通过应用程序,他们必须选择一个单元格,我可以放置感叹号以通知编译器该单元格在行为中有一个值(索引路径)
为什么感叹号会在“self.tableview”之后而不是在括号中的“sender as UITableView”之后?
如果我的假设是正确的,我可以使用if let
语法,因为我在上一行代码中有一个可选项?
答案 0 :(得分:0)
self.tableView和indexPathForCell()都是选项。通过敲击一个,你只有一个可选的取消引用结果。 sender也是一个可选的,indexPathForCell()不带一个可选的,所以它也可能需要一个爆炸,但我没有编译它所以我不能确定编译器会做什么。
self.tableView是对可能尚未设置的属性的引用(例如,为nil),因此它是可选的。你可以用例如@IBOutlet来声明它!最后,如果你知道它总是被定义,比如来自故事板,那么你以后就不必再取消引用它了。
常见的事情是:
@IBOutlet var tableView : UITableView!
这是一个隐式解包的可选项,如果在nil时引用它将产生错误。但你不需要使用!取消引用。
答案 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
,在程序编译之前未定义