根据Apple文档,可选链接如下:
如果可选值为非零,则通过在要调用属性,方法或下标的可选值之后放置一个问号(?)来指定可选链接。 ...当可选项为nil时,可选链接优雅地失败...
我对此的解释是,以下结构是可选链接:
someMasterObject.possiblyNilHandler?.handleTheSituation()
...如果处理程序不是nil,则上面的行会调用handleTheSituation方法,如果处理程序为nil,则会优雅地失败(跳过行)。
然而,我看到的可选链接的几乎所有示例都使用“if let”构造,如下:
if let handler = someMasterObject.possiblyNilHandler{
handler.handleTheSituation()
}
事实上,我在网上找到的文档和示例大量使用了与可选链接相关的“if let”结构,看起来似乎是IS可选链接。
但是,我是否正确假设我的第一个示例是支持使用可选链接,并且if let构造是使用(或紧密绑定)可选链接的另一个构造?
答案 0 :(得分: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
答案 1 :(得分:5)
结论是正确的 - let
是独立的,但却是有用的构造。在上下文中,它仅在if-body中引入绑定,并且仅在绑定值不为-nil时才执行if-body。 (从技术上讲,它会解开可选的绑定。)
let
不会影响右边的表达式(有或没有链接)的处理方式。例如,如果someMasterObject
是可选的/无,则会失败,而不是"链" - 即使使用let
。
当一个或另一个(或两者)更多"正确"取决于具体情况:例如。什么是被束缚的,纠正措施应该是什么。
例如,如果someMasterObject
可能为零,我们可能会使用以下链接和let
。还要注意返回值是如何重要的,并且不是简单地丢弃或者在失败时没有"
if let handler = someMasterObject?.possiblyNilHandler{
return handler.handleTheSituation()
} else {
return FAILED_TO_CALL
}
然后将其与非等效链接形式进行比较,该形式仅在失败调用的情况下返回nil
,但是nil可能是来自{{的有效返回值1}}!
handleTheSituation
另一方面,请考虑始终将链接直接转换为嵌套的if-let语句:
return someMasterObject?.possiblyNilHandler?.handleTheSituation()
答案 2 :(得分:1)
通过可选链接调用方法完全没问题 - 您不需要围绕它if
。如果在调用时可选值恰好是nil
,则代码不会抛出异常。但是,您无法确定方法是否已运行。
但是,通常您希望在可选的链接方法调用周围放置if
以检测是否已调用该方法:
func printNumberOfRooms() {
println("The number of rooms is \(numberOfRooms)")
}
if john.residence?.printNumberOfRooms() != nil {
println("It was possible to print the number of rooms.")
} else {
println("It was not possible to print the number of rooms.")
}
请注意,即使示例中的函数没有返回值,nil
检查仍然有效。由于使用可选链接在可选值上调用它,因此类型为Void?
,而不是Void
,这使得比较成为可能。