在 Swift 中,switch 语句支持扩展的模式匹配:你可以使用 where 为单个 case 添加条件。这使得实施复杂的业务逻辑和过滤成为可能。
示例:
enum Person { case student(score: Int) case teacher(specialty: String) } let people = [Person.student(score: 95), Person.teacher(specialty: "Math"), Person.student(score: 65)] for person in people { switch person { case .student(let score) where score > 90: print("优秀生,成绩是 \(score)") case .teacher(let specialty): print("学科老师:\(specialty)") default: print("其他情况") } }
使用 where 提高了可读性并避免了代码重复,但过于复杂的条件可能会降低可维护性,而带有关联值的模式匹配需要严格控制 case 的顺序。
问题: "在 switch 中使用 where 进行模式匹配时,是否必须在每个 case 中调用具有唯一名称的变量?"
回答: 不一定,但推荐这样做以避免混淆。如果在不同的 case 中使用相同的变量名,则上下文将限制在相应的 case 中,但相同的名称可能会妨碍代码的可读性和维护性。
示例:
switch value { case .status(let code) where code == 200: print("OK") case .status(let code) where code == 404: print("未找到")
故事 1
在一个银行应用程序中,有一个状态分析部分,包含多个 where 条件。由于缺少 break 和 case 的错误顺序,出现了未处理特定情况的情况,用户未能看到完整的交易状态。该错误仅在现场测试时被发现。
故事 2
在授权系统中,开发人员在不同的 case 中使用了相同的变量名称,导致混淆和错误:在第二个 case 中尝试使用在另一个 case 中定义的变量。构建成功,但在某些场景下不正确。
故事 3
在复杂的模式匹配与 where 中,没有考虑到 default 不会处理某些关联枚举的组合,导致应用程序因模式匹配失败而崩溃。该问题仅在将来集成新数据类型时被注意到。