swift 可选链接 - 它会失败吗?
swift optional chaining - can it fail?
当运行以下代码时:
a?.b?.doSomething()
如果 a
或 b
为零会怎样?它会失败吗?还是继续执行下一段代码?
和下面的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 的一个有用且容易被误用的特性。
游乐场和手册是你的朋友。
当运行以下代码时:
a?.b?.doSomething()
如果 a
或 b
为零会怎样?它会失败吗?还是继续执行下一段代码?
和下面的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 的一个有用且容易被误用的特性。
游乐场和手册是你的朋友。