HarmonyOS NEXT鸿蒙开发 ArkTS:枚举 作者:马育民 • 2025-09-28 22:58 • 阅读:10012 # 提出问题 当变量的值是 `红灯` 时,打印 `红灯停`;值是 `绿灯` 时,打印 `绿灯行`;值是 `黄灯` 时,打印 `黄灯警示` 实现: ``` let color:string = "红灯"; if( "红灯" == color ){ console.log("红灯停"); }else if( "绿灯" == color ){ console.log("绿灯行"); }else{ console.log("黄灯警示!"); } ``` ### 缺点 变量 `color` 可以是 **不合理的值**,如: ``` let color:string = "白灯"; ``` 或者 ``` let color:string = "李雷"; ``` ### 解决 使用枚举 # 枚举介绍 在 ArkTS 中,枚举(Enum)是一种特殊的数据类型,用于定义一组命名的常量集合,使代码更具可读性和可维护性。枚举在鸿蒙应用开发中常用于表示固定的状态、类型或选项集合。 ### 特点 - **类型安全**:枚举成员是特定类型,避免使用魔术数字或字符串导致的错误。 - **反向映射**:数字枚举支持通过值获取成员名称(如 `Direction[0]` 返回 `"Up"`)。 - **不可修改**:枚举成员的值在定义后不可更改。 通过枚举,可以使代码逻辑更清晰,尤其在处理多状态、多选项的场景中非常实用 ### 应用场景 在有固定的几个值时,就应该用枚举,例子: - 学历:博士、硕士、本科、专科 - 星期:星期一、星期二、星期日 # 基本枚举定义 枚举通过 `enum` 关键字定义,默认情况下,枚举成员的值从 `0` 开始递增: ```typescript // 定义枚举 enum Color { Red, // 0 Green, // 1 Yello, // 2 } ``` ### 使用 ``` // 使用枚举 let c: Color = Color.Red; console.log(c); // 输出:0 console.log(Color[0]); // 输出:"Red" ``` # 自定义枚举值 可以为枚举成员指定自定义值(数字或字符串): ### 例子1 ```typescript // 数字枚举(可指定初始值,后续成员自动递增) enum Status { Success = 200, NotFound = 404, Error = 500 } console.log(Status.Success); // 输出:200 ``` ### 例子2 ``` // 字符串枚举(必须为每个成员指定字符串值) enum Color { Red = "RED", Green = "GREEN", Blue = "BLUE" } console.log(Color.Green); // 输出:"GREEN" ``` ### 例子3 ``` // 混合类型枚举(不推荐,易混淆) enum Mixed { A, // 0 B = "B", C = 10, D // 11(基于上一个值递增) } ``` # 常量枚举 使用 `const enum` 定义常量枚举,编译时会被直接替换为对应的值,减少运行时开销: ```typescript const enum Weekday { Mon, Tue, Wed, Thu, Fri, Sat, Sun } let day: Weekday = Weekday.Fri; console.log(day); // 输出:4(编译后直接替换为 4) ``` > 注意:常量枚举不支持反向映射(如 `Weekday[4]` 会报错)。 # 枚举在鸿蒙 UI 中的应用 在鸿蒙界面开发中,枚举常用于状态管理或选项控制: ```typescript // 定义按钮状态枚举 enum ButtonState { Normal, Pressed, Disabled } @Entry @Component struct EnumDemo { @State currentState: ButtonState = ButtonState.Normal; build() { Column() { Button("点击我") .onClick(() => { this.currentState = ButtonState.Pressed; }) .backgroundColor(this.getButtonColor()) .padding(10) } .padding(20) } // 根据枚举状态返回对应颜色 getButtonColor(): string { switch (this.currentState) { case ButtonState.Normal: return "#007DFF"; case ButtonState.Pressed: return "#0051AA"; case ButtonState.Disabled: return "#CCCCCC"; default: return "#007DFF"; } } } ``` 原文出处:http://www.malaoshi.top/show_1GW1wi3jZYqT.html