运行以下代码时:
a?.b?.doSomething()
如果a
或b
为零,会发生什么?它会失败吗?或者只是继续执行下一个代码?
它与以下C代码相同 -
if (a && a.b)
doSomething()
else
// do nothing, without failing, nor throwing exception
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
,因为它们只是向你展示将在控制台中打印的内容)。
基本上可选的链接用于防止App中的崩溃。如果你使用这里?它将检查特定对象是否为零,如果它为零,则它将不执行该方法。如果您不使用可选项,并尝试在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()
}
不会编译。编译器告诉你:
无法将“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的一个有用且容易被滥用的特性。
游乐场和手册是你的朋友。