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

问题描述 投票:-1回答:3

运行以下代码时:

a?.b?.doSomething()

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

它与以下C代码相同 -

if (a && a.b)
   doSomething()
else
  // do nothing, without failing, nor throwing exception
swift optional
3个回答
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为零,则不会继续执行。

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


1
投票

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


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”类型的值转换为预期值“Bool”

在Swift中,与例如C不同,条件需要布尔参数。 “a”和“a.b”都不是布尔值。

如果您将示例更改为:


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

它汇编了警告:

将“A”类型的非可选值与“nil”进行比较始终返回true

为了让事情合理,我没有选择“a”。如果你使“a”可选,那么你会得到很多编译错误,告诉你它必须被解包。

另外:阅读“警卫”部分。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.