编程Swift开发者

Swift中范围的模式匹配是如何工作的,实施switch进行比较时需要注意哪些特性?

用 Hintsage AI 助手通过面试

答案

在Swift中,范围匹配通常在switch-case中使用,用于将值与范围进行比较。为此,使用操作符..<(半开范围)和...(闭合范围):

let score = 76 switch score { case 0..<60: print("不及格") case 60..<80: print("及格") case 80...100: print("优秀") default: print("不正确的值") }

特性:

  • 范围必须是递增的:从小到大(否则范围将是空的)。
  • 如果值在范围内,匹配将成功。
  • 由于范围是结构体,可以将其用于与任何Comparable类型进行匹配。

诱导性问题

如果在switch中使用不包括值的上限范围(例如,0..<5),而变量等于5,会发生什么?

人们常常认为这样一个case会匹配,但这是错误的:操作符..<不包括上限。示例:

let value = 5 switch value { case 0..<5: print("0-4") case 5: print("五") default: print("其他") } // 输出:"五"

由于对主题细节缺乏了解而造成的真实错误示例


故事

开发者实现了根据范围显示用户分数的功能,使用了闭合范围,右边界超过了可能的最大值。这导致某些值同时落入两个区间,逻辑工作不正常。


故事

应用中使用了带范围的switch-case,其中一个值由于误使用操作符(例如,0...10和11...20,而值10.5未匹配到任何地方)而未包含在任何范围内。这个BUG只在生产环境中被发现。


故事

在服务的代码中,通过范围匹配比较日期,错误地使用了半开范围:结束日期未包含,结果导致正确的区间被剔除,无法在最后一个有效的日子进行预订。