美文网首页
Swift 重构:可选项(Optional)扩展

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

作者: SoaringHeart | 来源:发表于2021-07-01 15:36 被阅读0次

可选值(Optional)是 Swift 语言最基础的内容。因为它迫使开发者妥善处理边缘情况。可选值的语言特性能让发者在开发阶段发现并处理整个类别的 bug。因为 Swift 在语法上通过 可选链模式匹配if letguard 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
    }
}

相关文章

网友评论

      本文标题:Swift 重构:可选项(Optional)扩展

      本文链接:https://www.haomeiwen.com/subject/gfijultx.html