Swift枚举模式匹配:无需if/guard/switch的简化写法是否存在?
无需if/guard/switch的Swift枚举模式匹配写法
当然有啦!Swift在后续版本(尤其是5.9+)里新增了不少简洁的模式匹配语法,再结合函数式编程的思路,完全能实现不用if/guard/switch的单行枚举处理。之前我也疑惑过是不是不存在这种写法,后来摸索出几个实用的场景:
1. 布尔值模式匹配(Swift 5.9+)
Swift 5.9开始支持直接把模式匹配当成布尔表达式用,不用套在if里。比如判断枚举是不是某个case:
enum Direction { case left, right, up, down } let currentDir = Direction.right // 单行判断是否为left let isLeft = case .left = currentDir // false let isRight = case .right = currentDir // true
如果是带关联值的枚举,还能同时绑定值并判断:
enum Result { case success(Int), failure(String) } let result = Result.success(42) // 单行绑定success的关联值,不是的话返回nil let successValue: Int? = case let .success(val) = result ? val : nil // 或者更简洁的,给个默认值 let successVal = (case let .success(v)) = result ? v : 0
2. 用Optional的函数式API(针对Optional枚举)
Optional本身就是Swift的内置枚举(enum Optional<Wrapped> { case none, some(Wrapped) }),我们可以用map、flatMap或者??运算符来处理,全程不用条件语句:
let optionalNum: Int? = 7 // 单行获取值或默认值 let num = optionalNum ?? 0 // 单行对值做转换,空的话用默认值 let doubled = optionalNum.map { $0 * 2 } ?? 0
3. 给自定义枚举加函数式扩展
对于自己定义的枚举,我们可以扩展出类似map的方法,这样调用的时候就是清爽的单行,不用写条件语句:
enum Status { case success(String), failure(Error), loading } // 给Status加个针对success case的map方法 extension Status { func mapSuccess<T>(_ transform: (String) -> T) -> T? { // 这里内部用了guard,但调用方完全不用写条件 guard case let .success(msg) = self else { return nil } return transform(msg) } } let currentStatus = Status.success("Task done!") // 单行拿到转换后的结果,或者默认提示 let displayMsg = currentStatus.mapSuccess { "✅ \($0)" } ?? "🔄 Loading or failed"
4. 关联值的直接提取(单行)
对于带关联值的枚举,还可以用模式匹配结合三元运算符直接提取值:
enum Shape { case circle(radius: Double), square(side: Double) } let shape = Shape.circle(radius: 5) // 单行提取半径,不是circle的话返回0 let radius = case let .circle(r) = shape ? r : 0.0
这些写法要么是利用了Swift新版本的语法糖,要么是函数式编程的思路,不是不存在,只是需要了解这些进阶用法~
内容的提问来源于stack exchange,提问作者errnesto
相关产品推荐
相关产品推荐

