Swift,可选包装器。 “?” “!”我明白它是如何工作的。但为什么它比!= nil检查更好

时间:2015-03-13 16:01:14

标签: swift syntax casting operator-keyword

我明白“!”要么 ”?”作品。但我不太确定与之相比的额外好处是什么!= nil checking。转移到“!?”的额外好处是什么? 我觉得这只是Apple添加的东西,但与iOS现状相比,无法真正看到额外的好处。 我错过了什么吗? 提前谢谢。

2 个答案:

答案 0 :(得分:5)

关于链接,?运算符非常方便,例如:

a?.b?.c?.doSomething()

否则,您必须检查abc nil,这可能会导致代码比链接更难以理解。

另一件事是,您可以轻松地将参数标记为可选,例如

func someFunc(arg: Type?)

并且很明显,这是一种可能是nil的类型,即语言强制执行此操作。否则你会传递一些可能是nil的内容而忘记检查并遇到崩溃。

答案 1 :(得分:5)

检查nil和要求打开可选项之间的区别可能等于代码崩溃与否之间的差异。如果使用正确,可选项可以提高安全性使代码更具可读性。

假设您有一个数组,并且想要获取其中的第一个值。你可以这样做:

if !arr.isEmpty {
    useValue(arr[0])
}

但是,当然,很容易忘记isEmpty部分,如果你这样做,你的代码就会因为越界错误而崩溃。

所以,有一个更好的方法:使用数组的first方法,如果数组为空,则返回带nil的可选项:

if let val = arr.first {
    useValue(val)
}

使用此表单,无法错误。如果不打开它,就不可能使用arr. first值。如果您忘记了,则会出现编译错误。我的眼睛也更具可读性

据推测,你希望你的!= nil公式能够像这样工作:

if arr.first != nil {
    // all optionals would be “implicit”
    useValue(arr.first)
}

暂且不说你正在调用.first两次,效率有点低,而且类型兼容性问题,基本上会让你回到原点 - 你可能会忘记进行nil比较,然后,kaboom。或者,您可以采用Objective-C方法并说nil可以发送消息 - 但这也会导致各种混淆(个人我讨厌隐含发送消息的概念,意味着无操作),并且还导致问题,当函数返回值类型(例如Int)时,您会怎么做。一切都可以为空吗?这导致了Obj-C土地的混乱。

更重要的是,一旦你处理了可选项,你可以引入各种各样的便利,例如nil-coalescing:

// default to 0 if no first element
arr.first ?? 0
// much neater than this equivalent form:
arr.first != nil ? arr.first : 0

或可选比较:

// will only be true if arr is non-nil and zero
if arr.first == 0 {

}

有关更多示例,请参阅this answer