有些人以前问过这个问题,但没有接受答案.
我有一个UITableViewCell包含一个UITextField.
如果我在textField外面略微点击,则该行突出显示.我想阻止这个.
为了防止它,我做以下事情:
override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath! {
return nil
}
Run Code Online (Sandbox Code Playgroud)
这完全没问题.这是我的问题.本教程的作者指出:
请注意,只有在返回类型后面有问号(或感叹号)时,才允许从方法返回nil.
他的意思是你可以在可选的返回类型后面添加一个感叹号.为什么程序没有崩溃?在IndexPath返回类型之后放置感叹号后返回nil不会崩溃.我想 !会明确解开零并失败????
从Swift 3开始,"Implicitly unwrapped optional"不是一个单独的类型,而是一个常规/强选项声明的属性.有关详细信息,请参阅SE-0054废除ImplicitlyUnwrappedOptional类型.
具有IUO返回类型的函数可以返回nil,并将返回值赋给变量使得它成为常规可选:
func foo() -> Int! {
return nil
}
let x = foo() // Type of `x` is `Int?`
print(x) // nil
Run Code Online (Sandbox Code Playgroud)
只有在无法作为可选项进行评估时,才会强制解包该值(并导致运行时异常为值nil):
let y = 1 + foo() // Fatal error: Unexpectedly found nil while unwrapping an Optional value
Run Code Online (Sandbox Code Playgroud)
在你的情况下,你的
override func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath!
Run Code Online (Sandbox Code Playgroud)
方法覆盖该UITableViewController方法
func tableView(_ tableView: UITableView, willSelectRowAt indexPath: IndexPath) -> IndexPath?
Run Code Online (Sandbox Code Playgroud)
并且可以回来nil.除非调用者解包该值,否则不会崩溃.
备注:以上内容是为什么您的代码编译和工作的解释.通常,我没有看到使用隐式解包的可选返回类型的充分理由.IUO的主要用例在SE-0054中说明:
ImplicitlyUnwrappedOptional("IUO")类型是用于导入Objective-C API的有用工具,其中未指定参数或返回类型的可为空性.它还代表了一种在初始化器中处理明确初始化问题的便捷机制.
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |