Swift中的元组模式匹配允许便捷地比较和解包值。在switch语句中可以直接在模式中解析元组:
let point = (x: 0, y: 2) switch point { case (0, 0): print("在坐标原点") case (0, let y): print("x = 0, y = \(y)") case let (x, y) where x == y: print("x等于y") default: print("其他点") }
细节:
在switch-case中能否使用不同类型的case模式来比较类型为
(String, Int)的元组,例如case (let a, let b):?
通常回答可以,但重要的是—模式中变量的类型必须严格与元组的类型相符。
let pair = ("abc", 5) switch pair { case (let text, let number): print("字符串: \(text), 数字: \(number)") // 正确 case (let x, let y) where x == y: print("错误") // 错误:二元操作符'=='无法应用于类型'String'和'Int'的操作数 default: break }
如果类型不匹配,编译器将在编译阶段报错。
故事
在一个项目中,尝试使用switch-case解析服务器响应为元组,而没有考虑可能的nil值。这导致没有一个case适合,最终触发了default,尽管预想了其他逻辑。
故事
类型不匹配:在处理元组的函数中接收到(Int, String),尝试解包为(String, Int)。结果——编译阶段崩溃,浪费了寻找原因的时间。
故事
在解包结果元组时使用guard,没有考虑负值的情况,尽管处理只预想用于正数。最终一部分有效的案例被忽略,这在业务逻辑中成了问题。