可选值(Optional)是 Swift 语言最基础的内容。因为它迫使开发者妥善处理边缘情况。可选值的语言特性能让发者在开发阶段发现并处理整个类别的 bug。因为 Swift 在语法上通过 可选链、模式匹配、if let
或 guard let
等功能来弥补它。但在某些情况下,可选值容易造成多分支条件。有时,一个非常简洁的方法通常允许你用一行代码表达某个概念,而不是用多行组合的 if let
语句。
example
func defaultValue() -> Int {
//经过复杂的计算,得出结果
return 1111
}
let optional: Int? = nil
print("[line \(#line)]", optional.or(else: defaultValue())) //1111
print("[line \(#line)]", optional.or(else: {
//经过复杂的计算,得出结果
return 12
})) //12
// 仅会影响 id < 1000 的用户
if let aUser = user, user.id < 1000 { aUser.upgradeToPremium() }
// 使用 `filter`
user.filter({ $0.id < 1000 })?.upgradeToPremium()
extension
public extension Optional {
/// 可选值为空的时候返回 true
var isNone: Bool {
switch self {
case .some( _ ):
return false
case .none:
return true
}
}
/// 返回可选值或 `else` 表达式返回的值
/// 例如. optional.or(else: Selector)
func or(else: @autoclosure () -> Wrapped) -> Wrapped {
return self ?? `else`()
}
/// 返回可选值或者 `else` 闭包返回的值
// 例如. optional.or(else: {
/// ... do a lot of stuff
/// })
func or(else: () -> Wrapped) -> Wrapped {
return self ?? `else`()
}
/// 可选值不为空且可选值满足 `predicate` 条件才返回,否则返回 `nil`
func filter(_ predicate: (Wrapped) -> Bool) -> Wrapped? {
guard let unwrapped = self,
predicate(unwrapped) else { return nil }
return unwrapped
}
}
网友评论