Swift 重构:可选项(Optional)扩展

可选值(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
    }
}
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享