📜  Swift-枚举(1)

📅  最后修改于: 2023-12-03 14:47:47.999000             🧑  作者: Mango

Swift-枚举

枚举(Enum)就是一个带有可选值的数据类型,在 Swift 中,枚举是一级类型(First-class Type),它支持许多其他语言不支持的特性,如关联值(Associated Values)、原始值(Raw Values)、递归枚举(Recursive Enums)等。

创建枚举

在 Swift 中,使用 enum 关键字来声明和定义一个枚举。下面是一个定义 Season 枚举的例子:

enum Season {
    case spring
    case summer
    case autumn
    case winter
}

在上面的例子中,我们定义了一个 Season 枚举类型,并且它有四个枚举成员 springsummerautumnwinter

我们也可以使用一行来定义上面的枚举:

enum Season { case spring, summer, autumn, winter }
访问枚举成员

枚举成员可以通过点(.)语法来访问,可以和其他类型的属性或方法一样来使用:

let currentSeason = Season.summer
print(currentSeason) // 输出: summer

switch currentSeason {
case .spring:
    print("It's spring.")
case .summer:
    print("It's summer.")
case .autumn:
    print("It's autumn.")
case .winter:
    print("It's winter.")
}

上面的示例展示了如何使用枚举成员来进行流程控制,使用 switch 语句来判断当前的季节,并输出对应的信息。

关联值

枚举的每个成员都可以关联一些值。这些关联值可以是任何类型,可以是一个或多个值,而且可以在枚举成员的定义时指定。

下面是一个定义 Student 枚举的例子,其中每个成员都关联一个字符串类型的值:

enum Student {
    case elementary(name: String)
    case middle(name: String)
    case high(name: String, grade: Int)
}

let stu1 = Student.elementary(name: "Tom")
let stu2 = Student.middle(name: "Bob")
let stu3 = Student.high(name: "Lucy", grade: 9)

上面的例子中,定义了一个 Student 枚举类型,并且定义了三个枚举成员 elementarymiddlehigh,分别关联了不同的值。

原始值

在 Swift 中,枚举成员也可以有原始值(Raw Values)。原始值是每个枚举成员提供的一个初始值,它可以是一个字符、整数或字符串等。

在声明一个枚举类型时,可以为其中某些成员分配原始值,这些原始值必须是唯一的。下面是一个定义 Weekday 枚举的例子,其中使用字符串类型的原始值:

enum Weekday: String {
    case monday = "Monday"
    case tuesday = "Tuesday"
    case wednesday = "Wednesday"
    case thursday = "Thursday"
    case friday = "Friday"
    case saturday = "Saturday"
    case sunday = "Sunday"
}

print(Weekday.monday.rawValue) // 输出: Monday

上面的示例中,我们定义了一个 Weekday 枚举类型,并且为其中的每个枚举成员分配了一个字符串类型的原始值。在输出成员的原始值时,可以使用 rawValue 属性来访问。

递归枚举

递归枚举(Recursive Enums)是一种特殊类型的枚举,它包含一个或多个成员,其中至少一个成员的关联值是该枚举类型本身。递归枚举通常用于表示一些具有自相似性质的数据。

下面是一个定义 Node 递归枚举的例子,其中每个成员都包含了一个或多个嵌套的 Node 实例:

indirect enum Node {
    case leaf(Int)
    case node(left: Node, right: Node)
}

let tree: Node = .node(left: .node(left: .leaf(1), right: .leaf(2)), right: .node(left: .leaf(3), right: .leaf(4)))

上面的示例中,我们定义了一个 Node 递归枚举类型,其中一个成员 node 的关联值包含了两个嵌套的 Node 实例。在对 tree 的赋值中,我们使用了嵌套的 nodeleaf 成员来构造了一棵树形结构。

总结

Swift 中的枚举是一种强大而灵活的数据类型,支持许多特性,如关联值、原始值、递归枚举等。在开发中,合理地使用枚举可以让我们的代码更加简洁、清晰、易读和易于维护。