运行以下代码时:
a?.b?.doSomething()
如果a
或b
为零会发生什么?会失败吗?还是继续执行下一个代码?
是否与以下C代码相同-
if (a && a.b)
doSomething()
else
// do nothing, without failing, nor throwing exception
答案 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的一项有用且易于滥用的功能。
游乐场和手册是您的朋友。