swift 可选链接 - 它会失败吗?

swift optional chaining - can it fail?

当运行以下代码时:

a?.b?.doSomething()

如果 ab 为零会怎样?它会失败吗?还是继续执行下一段代码?

和下面的C代码一样吗-

if (a && a.b)
   doSomething()
else
  // do nothing, without failing, nor throwing exception

b 为 nil,什么也没有打印出来:

import Foundation

struct ASample {
    var b:BSample? = nil
}

struct BSample {
    func doSomething(){
        print("Hey")
    }
}

let a: ASample? = ASample()

a?.b?.doSomething()
#

b不为零,正在打印"Hey":

import Foundation

struct ASample {
    var b:BSample? = BSample()
}

struct BSample {
    func doSomething(){
        print("Hey")
    }
}

let a: ASample? = ASample()

a?.b?.doSomething()
#Hey

同样适用于a。如果a为nil,则不会继续执行。

您可以在 http://online.swiftplayground.run/ (PS: 试用时省略 ##Hey,因为它们只是向您展示将在控制台中打印的内容)。

基本上是可选的链接,用于防止应用程序崩溃。 在这里,如果你使用?它将检查特定对象是否为 nil,如果为 nil,则它不会执行该方法。 如果你不使用可选的,并尝试在 nil 对象上执行方法,它会使应用程序崩溃。 所以这里当且仅当 a 和 b 对象不为 nil 时,doSomething() 才会执行。

此外,请注意:

struct A {
    let b: Int? = nil
    func doSomething() { print("Doing Something") }
    func doSomethingElse() { print("Doing Something Else") }
}
let a = A()
if (a && a.b) {
    a.doSomething()
} else {
    a.doSomethingElse()
}

不会编译。编译器告诉你:

Cannot convert value of type 'A' to expected value 'Bool'

在 Swift 中,与 C 等语言不同,条件语句需要布尔参数。两者都不 "a" 和 "a.b" 都不是布尔值。

如果将示例更改为:


if (a != nil && a.b != nil) {
    a.doSomething()
} else {
    a.doSomethingElse()
}

编译时出现警告:

Comparing non-optional value of type 'A' to 'nil' always returns true

我没有将 "a" 设为可选只是为了让事情变得合理。如果你使 "a" 可选,那么你会得到一大堆编译错误,告诉你它必须被解包。

另外:阅读关于 "guard."

的部分

IMO,可选项是 Swift 的一个有用且容易被误用的特性。

游乐场和手册是你的朋友。