我明白“!”要么 ”?”作品。但我不太确定与之相比的额外好处是什么!= nil checking。转移到“!?”的额外好处是什么? 我觉得这只是Apple添加的东西,但与iOS现状相比,无法真正看到额外的好处。 我错过了什么吗? 提前谢谢。
答案 0 :(得分:5)
关于链接,?
运算符非常方便,例如:
a?.b?.c?.doSomething()
否则,您必须检查a
,b
和c
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