如何更好地理解可选项
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 的解释,但仍然有疑问。
无论如何,
行
let cellIndexPath = self.tableView!.indexPathForCell(sender as UITableViewCell)
是否因为用户不能 select 我的 table 中的某个单元格而将此语句视为可选语句?有了这个,因为我知道只要用户想继续使用应用程序,他们就必须 select 一个单元格,我可以放置感叹号来通知编译器这个单元格确实有一个值(索引路径)?
为什么感叹号在"self.tableview"之后,而不是在括号中的“sender as UITableView)之后?
如果我的假设是正确的,我可以使用 if let
语法,因为我在前一行代码中有一个可选的?
self.tableView 和 indexPathForCell() 都是可选的。通过敲击一个,您在结果中只有一个可选的取消引用。 sender 也是一个可选的,indexPathForCell() 不采用可选的,所以它可能也需要一个 bang,但我还没有编译它所以我不能确定编译器会做什么。
self.tableView 是对可能未设置的 属性 的引用(例如为 nil),因此它是可选的。您可以声明它,例如带有 !最后,如果你知道它总是会被定义,比如从情节提要中定义,那么你以后就不必取消引用它了。
常见的做法是:
@IBOutlet var tableView : UITableView!
这是一个隐式展开的可选项,如果在 nil 时引用它会产生错误。但是你不需要使用!取消引用。
- 正确。该行的结果将产生一个可选的,您可以使用 if let
进行测试
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
中,直到程序编译
才定义
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 的解释,但仍然有疑问。
无论如何,
行
let cellIndexPath = self.tableView!.indexPathForCell(sender as UITableViewCell)
是否因为用户不能 select 我的 table 中的某个单元格而将此语句视为可选语句?有了这个,因为我知道只要用户想继续使用应用程序,他们就必须 select 一个单元格,我可以放置感叹号来通知编译器这个单元格确实有一个值(索引路径)?
为什么感叹号在"self.tableview"之后,而不是在括号中的“sender as UITableView)之后?
如果我的假设是正确的,我可以使用
if let
语法,因为我在前一行代码中有一个可选的?
self.tableView 和 indexPathForCell() 都是可选的。通过敲击一个,您在结果中只有一个可选的取消引用。 sender 也是一个可选的,indexPathForCell() 不采用可选的,所以它可能也需要一个 bang,但我还没有编译它所以我不能确定编译器会做什么。
self.tableView 是对可能未设置的 属性 的引用(例如为 nil),因此它是可选的。您可以声明它,例如带有 !最后,如果你知道它总是会被定义,比如从情节提要中定义,那么你以后就不必取消引用它了。
常见的做法是:
@IBOutlet var tableView : UITableView!
这是一个隐式展开的可选项,如果在 nil 时引用它会产生错误。但是你不需要使用!取消引用。
- 正确。该行的结果将产生一个可选的,您可以使用 if let 进行测试
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
中,直到程序编译