sta*_*mon 4 swift optional-chaining
根据Apple文档,可选链接如下:
如果可选值为非零,则通过在要调用属性,方法或下标的可选值之后放置问号(?)来指定可选链接....当可选项为零时,可选链接优雅地失败...
我对此的解释是,以下结构是可选链接:
someMasterObject.possiblyNilHandler?.handleTheSituation()
...如果处理程序不是nil,则上面的行将调用handleTheSituation方法,如果处理程序为nil,则优先失败(跳过行).
但是,我看到的可选链接的几乎所有示例都使用"if let"构造,如下所示:
if let handler = someMasterObject.possiblyNilHandler{
handler.handleTheSituation()
}
Run Code Online (Sandbox Code Playgroud)
事实上,我在网上找到的文档和示例大量使用了与可选链接相关的"if let"结构,看起来似乎是IS可选链接.
但是,我是否正确假设我的第一个示例是支持使用可选链接,并且if let构造是使用(或紧密绑定)可选链接的另一个构造?
vac*_*ama 10
可选链接在更多情况下非常有用,而不仅仅是可选的绑定(if let):
person?.name = "Fred" // assign "Fred" to name property if person is not nil
person?.congratulate() // call congratulate method if person is not nil
let name = person?.name ?? "none" // nil coalescing operator
let age = dict?["age"] ?? 0 // subscripting an optional variable
if var name = person?.name { // optional binding using var instead of let
Run Code Online (Sandbox Code Playgroud)
结论是正确的 - let是一个独立但有用的结构.在上下文中,它仅在if-body中引入绑定,并且仅在绑定值不为-nil时才执行if-body.(从技术上讲,它会解开可选的绑定.)
let不影响如何处理右边的表达式(有或没有链接).例如,如果someMasterObject是可选的/ nil它会失败而不是"链" - 即使是let.
当一个或另一个(或两者)更"正确"时,取决于具体情况:例如.什么是被束缚的以及纠正措施应该是什么.
例如,如果someMasterObject可能为零,我们可能会使用以下链接和链接let.还要注意返回值如何重要并且不是简单地丢弃或"失败时为零":
if let handler = someMasterObject?.possiblyNilHandler{
return handler.handleTheSituation()
} else {
return FAILED_TO_CALL
}
Run Code Online (Sandbox Code Playgroud)
然后将它与非等效链接形式进行比较,该形式仅nil在失败调用的情况下返回,但是nil可能是来自的有效返回值handleTheSituation!
return someMasterObject?.possiblyNilHandler?.handleTheSituation()
Run Code Online (Sandbox Code Playgroud)
另一方面,请考虑始终将链接直接转换为嵌套的if-let语句:
result_of_expression = someMasterObject?.possiblyNilHandle?.handleTheSituation()
if let master = someMasterObject {
if let handler = master.possiblyNilHandler {
result_of_expression = handler.handleTheSituation()
} else {
result_of_expression = nil
}
} else {
result_of_expression = nil
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3572 次 |
| 最近记录: |