微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我明白“!”要么 ”?”作品.但我不太确定与之相比的额外好处是什么!= nil checking.转移到“!?”的额外好处是什么?
我觉得这只是Apple添加的东西,但与iOS现状相比,无法真正看到额外的好处.
我错过了什么吗?
提前致谢.
检查nil和要求可选的unwrapped之间的区别可能相当于代码崩溃与否之间的差异.如果使用正确,可选项可以提高安全性并使代码更具可读性.

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

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

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

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

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

有了这个表格,你就不会错.使用arr是不可能的.没有打开它的第一个值.如果您忘记了,则会出现编译错误.它对我的眼睛也更具可读性/

大概你会期望你的!= nil公式可以像这样工作:

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

暂且不说你打电话.第一次两次,这有点效率低,而且类型兼容性的问题,基本上这让你回到原点 – 你可能忘记做零比较,然后,kaboom.或者,您可以采用Objective-C方法并说nil可以发送消息 – 但这也会导致各种混淆(个人我讨厌隐含发送消息的概念,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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐