编程中级 iOS 开发者

在 Swift 中,使用 where 进行 switch 的模式匹配是如何工作的?编写复杂模式时有哪些细节需要注意?

用 Hintsage AI 助手通过面试

回答。

在 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 不会处理某些关联枚举的组合,导致应用程序因模式匹配失败而崩溃。该问题仅在将来集成新数据类型时被注意到。