快速可选链-会失败吗?

时间:2019-04-16 09:17:30

标签: swift optional

运行以下代码时:

a?.b?.doSomething()

如果ab为零会发生什么?会失败吗?还是继续执行下一个代码?

是否与以下C代码相同-

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

3 个答案:

答案 0 :(得分:1)

b为零,没有打印出任何内容:

import Foundation

struct ASample {
    var b:BSample? = nil
}

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

let a: ASample? = ASample()

a?.b?.doSomething()
#

b不为零,正在打印“嘿”:

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,因为它们只是向您展示要打印的内容控制台)。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

另外,请注意:

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()
}

将无法编译。编译器告诉您:

  

无法将类型“ A”的值转换为期望值“布尔”

在Swift中,与C不同,条件语句需要布尔参数。都没有 “ a”或“ a.b”是布尔值。

如果将示例更改为:


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

它编译时显示警告:

  

将类型'A'的非可选值与'nil'进行比较总是返回true

我并不是为了保持合理性而将“ a”设为可选。如果将“ a”设置为可选,则将出现很多编译错误,告诉您必须将其拆开。

也:请阅读“警卫”部分。

IMO,可选选项是Swift的一项有用且易于滥用的功能。

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