该文档似乎没有明确提及可选链接评估的顺序,只是:
多个查询可以链接在一起,如果链中的任何链接为零,则整个链都会优雅地失败。
可能看起来很明显,但我需要确切地确认发生了什么,并认为这可能对其他人有帮助。例如,我们能够安全地做这种事情吗?
opVar?.someObject.someMethod(opVar!)
该文档似乎没有明确提及可选链接评估的顺序,只是:
多个查询可以链接在一起,如果链中的任何链接为零,则整个链都会优雅地失败。
可能看起来很明显,但我需要确切地确认发生了什么,并认为这可能对其他人有帮助。例如,我们能够安全地做这种事情吗?
opVar?.someObject.someMethod(opVar!)
如您所料,可选链从左到右延迟评估。链中第一个失败的可选项会停止对链的任何进一步评估。
// Playground test for left-to-right lazy evaluation.
struct C {
static var i = 0
func chain(count: Int) -> C? {
print("Expected \(count) -> \(C.i)")
assert(count == C.i)
C.i += 1
return C.i > 2 ? nil : self
}
}
let c = C()
c.chain(0)?.chain(1)?.chain(2)?.chain(3)!.chain(4)!
输出
Expected 0 -> 0
Expected 1 -> 1
Expected 2 -> 2