You specify optional chaining by placing a question mark (?) after the optional value on which you wish to call a property,method or subscript if the optional is non-nil. … optional chaining fails gracefully when the optional is nil …
我对此的解释是,以下结构是可选链接:
someMasterObject.possiblyNilHandler?.handleTheSituation()
…如果处理程序不是nil,则上面的行将调用handleTheSituation方法,如果处理程序为nil,则优先失败(跳过行).
但是,我看到的可选链接的几乎所有示例都使用“if let”构造,如下所示:
if let handler = someMasterObject.possiblyNilHandler{ handler.handleTheSituation() }
解决方法
let不影响如何处理右边的表达式(有或没有链接).例如,如果someMasterObject是可选的/ nil,它将失败而不是“链” – 即使使用let.
当一个或另一个(或两者)更“正确”时,取决于具体情况:例如.什么是被束缚的以及纠正措施应该是什么.
例如,如果someMasterObject可能为nil,我们可能会使用以下内容同时使用chaining和let.还要注意返回值如何重要并且不是简单地丢弃或“失败时为零”:
if let handler = someMasterObject?.possiblyNilHandler{ return handler.handleTheSituation() } else { return Failed_TO_CALL }
然后将它与非等效的链式形式进行比较,该形式只会在失败的调用情况下返回nil,但是nil可能是来自handleTheSituation的有效返回值!
return someMasterObject?.possiblyNilHandler?.handleTheSituation()
另一方面,请考虑始终将链接直接转换为嵌套的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 }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。