返回

Swift 枚举的全方位指南

IOS

在 Swift 编程语言中,枚举是一种强大的类型,它允许我们定义一组相关值,称为 case。这些 case 可以表示各种状态、选项或类别。枚举在建模真实世界实体或抽象概念方面非常有用,并且它们为我们的代码提供了类型安全和可读性。

要定义一个枚举,我们使用 enum ,后跟枚举的名称和大括号内的枚举 case:

enum Direction {
  case north
  case south
  case east
  case west
}

一旦定义了枚举,我们就可以通过访问枚举类型并使用点语法来访问其 case:

let direction = Direction.north

枚举 case 隐式地具有与它们的名称相同的整数值。默认情况下,第一个 case 的值为 0,每个后续 case 的值增加 1。我们可以使用 rawValue 属性来访问此整数值:

print(direction.rawValue) // 输出: 0

我们还可以显式地为枚举 case 指定整数值:

enum Direction: Int {
  case north = 1
  case south = 2
  case east = 3
  case west = 4
}

枚举有广泛的用法,包括:

  • 建模状态或选项: 枚举可以用来表示有限范围的状态或选项,例如方向、颜色或文件类型。
  • 错误处理: 枚举可以用来表示错误条件或操作的结果。
  • 数据结构: 枚举可以用来表示嵌套数据结构,例如树或图。
  • 类型安全: 枚举强制使用类型安全,确保我们只将有效的 case 分配给枚举变量。

Swift 允许我们与枚举 case 关联数据。这使我们可以存储附加信息或在枚举的基础上定义新的功能。

enum Person {
  case named(String)
  case unknown
}

在上面的示例中,named case 关联了一个 String 值,表示人的姓名。我们可以通过访问枚举变量的 associatedValue 属性来访问关联的数据:

let person = Person.named("John")
let name = person.associatedValue // 输出: "John"

枚举可以定义方法和属性,就像结构和类一样。这些方法和属性可以用来操纵枚举值或提供附加功能。

enum Shape {
  case circle(Double) // 半径
  case rectangle(Double, Double) // 长度和宽度
  
  var area: Double {
    switch self {
      case .circle(let radius):
        return Double.pi * radius * radius
      case .rectangle(let length, let width):
        return length * width
    }
  }
}

在上面的示例中,Shape 枚举定义了两个 case,每个 case 都关联了不同的数据。area 属性使用一个 switch 语句来计算每个 case 的面积。

我们可以使用 ==!= 运算符比较枚举值。比较将基于枚举的整数值(rawValue)。

let direction1 = Direction.north
let direction2 = Direction.south

if direction1 != direction2 {
  print("方向不相同") // 输出: "方向不相同"
}

枚举可以符合协议,就像结构和类一样。这允许我们定义枚举的通用行为并使用协议来对枚举进行分组。

protocol ShapeProtocol {
  var area: Double { get }
}

enum Shape: ShapeProtocol {
  // ... 之前的定义
}

在上面的示例中,Shape 枚举符合 ShapeProtocol 协议,该协议定义了 area 属性。

Swift 中的枚举提供了一系列优点:

  • 类型安全: 枚举确保只能分配有效的 case,防止出现类型错误。
  • 可读性: 枚举使代码更具可读性,因为它们明确定义了可能的值的集合。
  • 表达力: 枚举可以用来表示各种概念,从简单的状态到复杂的嵌套数据结构。
  • 可扩展性: 我们可以添加新 case 来轻松扩展枚举,而无需修改现有代码。