進入正題之前先科普一下 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