进入正题之前先科普一下 Swift 区间的知识。
Swift 中的区间有两种类型:闭区间和半开区间。
- 闭区间:用
a...b
表示,包含a
和b
。 - 半开区间:用
a..<b
表示,包含a
但不包含b
。
举个例子
想判断一个数字是否在 0 到 100 之间,通常会这样写:
let number = 50
if number >= 0 && number <= 100 {print("在 0 到 100 之间")
}
但是这种写法有点冗长,而且不够优雅。
现在我们可以用区间来简化这个判断。
let number = 50
if (0...100).contains(number) {print("在 0 到 100 之间")
}
// or
if (0..<101).contains(number) {print("在 0 到 100 之间")
}
现在进入正题 “单边区间(One-sided Range)”
1. 问题背景
需要实现一个简单的评分系统,根据用户评分的数值(如 App Store 中的打分)自动归类为“差评”、“中评”或“好评”。评分是一个浮点数,范围通常在 0 到 5 之间,分类逻辑如下:
- 小于 2.0 视为差评
- 介于 2.0 到 3.5(不含)之间为中评
- 大于等于 3.5 为好评
2. 常规解法
let score = 4.2if score < 2.0 {print("差评")
} else if score >= 2.0 && score < 3.5 {print("中评")
} else if score >= 3.5 && score <= 5.0 {print("好评")
} else {print("评分超出范围")
}
3. 用单边区间优雅处理
let score = 4.2guard (0.0...5.0).contains(score) else {print("非法评分")return
}switch score {
case ..<2.0:print("差评")
case 2.0..<3.5:print("中评")
case 3.5...:print("好评")
default:break
}
4. 常见使用场景举例
- 年龄分组:
let age = 67switch age {
case ..<13:print("儿童")
case 13..<20:print("青少年")
case 20..<65:print("成年人")
case 65...:print("老年人")
default:break
}
- 温度分类:
let temperature = 28switch temperature {
case ..<0:print("极寒")
case 0..<10:print("寒冷")
case 10..<25:print("凉爽")
case 25...35:print("温暖")
case 35...:print("炎热")
default:break
}
- 电量状态
let batteryLevel = 18switch batteryLevel {
case ..<20:print("低电量")
case 20..<80:print("正常")
case 80...:print("高电量")
default:break
}
5. Swift Evolution 提案链接
SE-0172