
回复
在HarmonyOS Next开发中,类型模式与枚举模式是实现类型安全匹配的核心工具。类型模式用于动态类型检查,枚举模式则针对枚举类型的构造器进行精准匹配。本文结合仓颉语言特性,解析这两种模式的语法规则、应用场景及与其他模式的协同逻辑。
类型模式用于判断值的运行时类型是否为某个类型的子类型,适用于多态场景下的动态分发。
match (value) {
case 标识符: 类型 => 类型匹配后执行逻辑
case _: 类型 => 仅类型匹配,不绑定变量
}
value
是类型
的实例或子类型实例,则匹配成功。
speak(animal: Dog()) // 输出:汪汪
### 2. 类型模式与接口匹配
当值实现某接口时,可通过类型模式判断是否符合接口约束:
```cj
interface Flyable { func fly() }
class Bird <: Flyable { func fly() { println("飞翔") } }
class Car {}
func testFly(obj: Any) {
match (obj) {
case flyable: Flyable => flyable.fly() // 匹配实现Flyable接口的类型
case _ => println("无法飞翔")
}
}
testFly(obj: Bird()) // 输出:飞翔
testFly(obj: Car()) // 输出:无法飞翔
Int
、String
)。枚举模式针对枚举类型的构造器进行匹配,支持无参、有参及递归构造器的精准解构。
直接通过构造器名称匹配枚举值:
enum Direction { | Up | Down | Left | Right }
func move(dir: Direction) {
match (dir) {
case Up => println("向上")
case Down => println("向下")
case Left | Right => println("水平移动") // 多构造器合并匹配
}
}
move(dir: .Left) // 输出:水平移动
通过模式匹配提取构造器参数值:
enum Temperature { | Celsius(Float) | Fahrenheit(Float) }
func convert(temp: Temperature) {
match (temp) {
case Celsius(c) => println("\(c)℃ = \(c * 1.8 + 32)℉") // 绑定模式c提取摄氏温度
case Fahrenheit(f) => println("\(f)℉ = \((f - 32) / 1.8)℃") // 绑定模式f提取华氏温度
}
}
convert(temp: .Celsius(25)) // 输出:25℃ = 77℉
递归枚举常用于构建树状结构(如表达式解析),模式匹配需处理递归层级:
enum Expr {
| Num(Int)
| Add(Expr, Expr) // 递归引用Expr类型
| Sub(Expr, Expr)
}
func evaluate(expr: Expr) -> Int {
match (expr) {
case Num(n) => n // 基础数值节点
case Add(l, r) => evaluate(l) + evaluate(r) // 递归计算加法节点
case Sub(l, r) => evaluate(l) - evaluate(r) // 递归计算减法节点
}
}
let expr = Add(Num(5), Sub(Num(10), Num(3)))
println(evaluate(expr: expr)) // 输出:5 + (10 - 3) = 12
在复杂场景中,可结合类型模式与枚举模式,实现多层数据的精准匹配。
enum DataWrapper {
| IntData(Int)
| StrData(String)
| ObjData(Object)
}
class Object {}
func processData(wrapper: DataWrapper) {
match (wrapper) {
case IntData(n: Int) => println("整数:\(n)") // 枚举模式+类型模式
case StrData(s: String) => println("字符串:\(s)")
case ObjData(obj: Object) => println("对象类型")
}
}
processData(wrapper: .StrData("Hello")) // 输出:字符串:Hello
通过枚举模式匹配错误类型,结合类型模式确保参数有效性:
enum Error {
| InvalidType(String)
| OutOfRange(Int, Int)
}
func validate(value: Any, min: Int, max: Int) -> Error? {
match (value) {
case n: Int where n < min || n > max => .OutOfRange(n, max) // 类型模式+条件判断
case s: String where s.isEmpty => .InvalidType("空字符串")
default => nil
}
}
let error = validate(value: 5, min: 10, max: 20)
match (error) {
case .OutOfRange(n, max) => println("\(n)超出最大值\(max)")
case .InvalidType(msg) => println(msg)
case _ => ()
}
使用类型模式过滤集合中的特定类型元素:
let items: Array<Any> = [1, "a", Dog(), 3.14]
let dogs = items.filter {
match ($0) {
case _: Dog => true // 类型模式匹配Dog实例
default => false
}
}
println(dogs.count) // 输出:1(仅一个Dog实例)
必须覆盖枚举的所有构造器或添加通配符,否则编译报错:
enum Color { | Red | Green | Blue }
func printColor(color: Color) {
match (color) {
case Red => println("红")
case Green => println("绿")
// 编译错误:未覆盖Blue构造器
}
}
确保类型模式中的类型是实际类型的父类或接口,避免无效匹配:
class Animal {}
class Dog <: Animal {}
func feed(animal: Animal) {
match (animal) {
case _: Dog => println("喂狗粮") // 正确:Dog是Animal的子类
case _: String => println("错误类型") // 错误:String与Animal无继承关系
}
}
在递归模式匹配中,需确保存在基础 case 避免无限递归:
enum List {
| Nil
| Cons(Int, List) // 递归构造器
}
func sum(list: List) -> Int {
match (list) {
case .Nil => 0 // 基础 case,终止递归
case .Cons(n, rest) => n + sum(list: rest) // 递归计算剩余元素
}
}
let list = Cons(1, Cons(2, Cons(3, Nil)))
println(sum(list: list)) // 输出:6
类型模式与枚举模式是HarmonyOS Next类型安全体系的重要组成部分: