
回复
在HarmonyOS Next开发中,模式匹配是仓颉语言的核心特性之一,它通过灵活的模式设计实现数据解构与逻辑分支控制。本文将聚焦常量模式和通配符模式,解析其语法规则、应用场景及与枚举类型的联动逻辑,帮助开发者掌握类型安全的条件判断技巧。
常量模式通过字面量值进行精准匹配,适用于已知固定值的条件判断场景。
类型 | 示例 | 匹配逻辑 |
---|---|---|
整数 | case 0 , case 100 |
值相等即匹配 |
浮点数 | case 3.14 , case 0.5f16 |
精确浮点值匹配 |
字符/字符串 | case 'A' , case "hello" |
字符编码或字符串内容相等 |
布尔值 | case true , case false |
布尔逻辑匹配 |
Unit | case () |
唯一值匹配 |
通过|
连接多个常量模式,实现“或”逻辑:
main() {
let score = 85
let grade = match (score) {
case 0..50 => "D" // 范围匹配(左闭右开,需显式定义范围模式)
case 60 | 70 => "C" // 多值匹配
case 80 | 90 | 100 => "A" // 多值精准匹配
case _ => "Invalid" // 通配符兜底
}
println(grade) // 输出:"Invalid"(因85不在匹配范围内)
}
常量模式可直接匹配枚举构造器(无参场景):
enum Direction { | Up | Down | Left | Right }
func handleDirection(dir: Direction) {
match (dir) {
case Direction.Up => println("向上移动")
case Down => println("向下移动") // 隐式类型匹配,等价于Direction.Down
case Left | Right => println("水平移动")
}
}
handleDirection(dir: .Right) // 输出:"水平移动"
通配符模式(_
)用于匹配任意值,是实现逻辑完整性的关键工具。
在枚举匹配中,若未覆盖所有构造器,编译器会强制要求添加通配符分支:
enum RGBColor { | Red | Green | Blue }
func printColorName(color: RGBColor) {
match (color) {
case Red => println("红色")
case Green => println("绿色")
// case Blue => println("蓝色") // 故意省略该分支
case _ => println("未知颜色") // 必须添加通配符以满足穷尽性要求
}
}
printColorName(color: .Blue) // 输出:"未知颜色"
在解构场景中,通配符可忽略无关数据:
let (x, _) = (10, 20) // 仅获取x=10,忽略第二个值
println(x) // 输出:10
for (_ in 1..5) { // 忽略循环索引,仅执行循环体
println("迭代中")
}
通配符可作为复杂模式的一部分,简化匹配逻辑:
enum Command { | Ping | Pong(Int) | Error(String) }
func processCommand(cmd: Command) {
match (cmd) {
case Ping => println("收到Ping")
case Pong(_) => println("收到Pong(忽略参数)") // 匹配Pong构造器但忽略参数
case Error(msg) => println("错误:\(msg)")
}
}
processCommand(cmd: .Pong(123)) // 输出:"收到Pong(忽略参数)"
仓颉编译器严格检查模式匹配的穷尽性,确保所有可能值都被处理,避免运行时漏洞。
对于枚举RGBColor
,若未匹配所有构造器且无通配符,编译会报错:
func incompleteMatch(color: RGBColor) {
match (color) {
case Red => println("红") // 缺少Green和Blue分支
// 编译错误:"Not all constructors of RGBColor are covered"
}
}
在数值匹配中,通配符用于处理未覆盖的边界值:
func validateNumber(n: Int) {
match (n) {
case 1..100 => println("有效范围")
case _ => println("超出范围") // 兜底所有其他值
}
}
匹配规则遵循“从上到下,优先命中”原则,需将高频条件置于顶部:
enum Event { | Click | DoubleClick | LongPress }
func handleEvent(event: Event) {
match (event) {
case DoubleClick => println("双击处理") // 高频操作优先匹配
case Click => println("单击处理")
case LongPress => println("长按处理")
}
}
在实际开发中,常结合常量模式的精准性与通配符的灵活性,实现简洁的逻辑表达。
enum Protocol { | Get("get") | Post("post") | Other(String) }
func parseProtocol(cmd: String) {
match (cmd) {
case Protocol.Get => println("处理GET请求") // 常量字符串匹配
case Protocol.Post => println("处理POST请求")
case Other(p) => println("未知协议:\(p)") // 通配符捕获剩余值
}
}
parseProtocol(cmd: "put") // 输出:"未知协议:put"
enum MachineState { | Running | Stopped | Paused(Int) }
func machineLogic(state: MachineState) {
match (state) {
case Running => start()
case Stopped => stop()
case Paused(time) => resume(time)
case _ => fatalError("非法状态") // 理论上不可达,增强健壮性
}
}
常量模式与通配符模式是HarmonyOS Next类型安全的基础工具: