检查 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 比较,然后,卡布姆。或者,您可以采用 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