首页 Swift中的枚举
文章
取消

Swift中的枚举

在 Swift 中,枚举是一种有用的数据类型,它可以帮助我们在代码中定义一组相关的值。这些值可以是整数、字符串或其他数据类型,但它们都属于同一个类别。在本文中,我们将深入讨论 Swift 中的枚举。

枚举的定义

在Swift中,枚举是一种用户自定义类型,用来表示有限个数的相关值。一个枚举类型定义了一个值的集合,这些值可以作为变量和常量使用。Swift中的枚举要比其他语言中的枚举更加强大,因为Swift的枚举可以拥有方法和属性。

在Swift中,定义一个简单的枚举非常容易:

1
2
3
4
5
6
enum CompassPoint {
    case north
    case south
    case east
    case west
}

这个例子定义了一个名为CompassPoint的枚举,它包含了四个成员:northsoutheastwest。每个成员都是该枚举的一个实例,代表了某个方向。

枚举成员的名称通常以小写字母开头,但也可以使用大写字母。当然,如果你需要将一个枚举成员命名为一个关键字或保留字,你可以使用反引号(`)将其括起来。

1
2
3
4
5
6
enum LogLevel {
    case `default`
    case debug
    case warning
    case error
}

关联值

Swift中的枚举可以像C语言中的枚举一样,只是一个整数,但它们可以更加灵活。枚举成员还可以与关联值相关联,从而添加更多信息。

我们可以以获取商品价格为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
enum Product {
    case book(Double)
    case movie(Double)
    case music(Double)
}

let product = Product.book(9.99)

switch product {
case .book(let price):
    print("This book costs $\(price)")
case .movie(let price):
    print("This movie costs $\(price)")
case .music(let price):
    print("This album costs $\(price)")
}

这里我们定义了一个Product枚举,其中每个成员都带有一个Double类型的关联值,代表该商品的价格。我们可以通过switch语句检查不同种类的商品,并打印出它们的价格。

原始值

Swift中的枚举还可以关联原始值,这些原始值可以是字符、字符串或其他整数类型。原始值是在定义枚举时预先分配的,并且与每个枚举成员相关联。

枚举的原始值可以在Swift中提供一个默认值:

1
2
3
4
5
enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

let earthsOrder = Planet.earth.rawValue

在这个例子中,我们定义了一个包含行星名称和顺序的枚举。每个Planet成员都有一个Int类型的原始值。在这里,我们指定mercury的原始值为1,venus的原始值为2,依此类推。如果没有给枚举成员设置原始值,则它们将依次增加1。

枚举的操作

在Swift中,枚举可以拥有方法和计算属性,就像结构体和类一样。这使得它们在处理复杂数据结构和逻辑时非常有用。

计算属性

枚举可以拥有计算属性,这些属性返回与枚举成员相关的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
enum Lightbulb {
    case on
    case off
	
	var energyConsumption: Double {
    	switch self {
    	case .on:
        	return 100.0
    	case .off:
        	return 0.0
    	}
	}
}

let bulb = Lightbulb.on
print(bulb.energyConsumption)

在这个例子中,我们定义了一个名为Lightbulb的枚举,它有两个成员:onoff。我们为此添加了一个计算属性energyConsumption,该属性返回与灯泡状态相关的能量消耗。

方法

枚举还可以拥有方法,这些方法是与枚举成员相关联的,可用于处理特定类型的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
enum TrafficLight {
    case red, yellow, green
    
    func next() -> TrafficLight {
        switch self {
        case .red:
            return .green
        case .yellow:
            return .red
        case .green:
            return .yellow
        }
    }
}

var light = TrafficLight.red
light = light.next()

在这个例子中,我们定义了一个TrafficLight枚举,它包含三个成员:红色、黄色和绿色。我们还添加了一个方法next(),该方法返回下一个交通信号灯的颜色(即红色-绿色-黄色)。

枚举的高级用法

Swift的枚举不仅可以代表简单的值集合,还可以实现更复杂的数据结构和算法。

递归枚举

递归枚举是一种枚举类型,它具有一个或多个成员变量,其类型是枚举类型本身。递归枚举在处理树形数据结构时非常有用。

例如,我们可以定义一个二叉树:

1
2
3
4
indirect enum BinaryTree<T> {
    case leaf(T)
    case node(BinaryTree<T>, BinaryTree<T>)
}

在这个例子中,我们定义了一个名为BinaryTree的递归枚举。它有两个成员:leaf表示二叉树的叶子节点,而node表示二叉树的分支节点。每个节点都可以包含另一个BinaryTree对象作为其左右子树。

关联类型

Swift中的关联类型是指使用占位符类型名称来标识某个类型,这个类型将在实际使用时被确定。枚举可以使用关联类型来定义泛型枚举。

1
2
3
4
enum Result<T, E> {
    case success(T)
    case failure(E)
}

在这个例子中,我们定义了一个Result枚举,它有两个关联类型T和E。当创建Result实例时,我们可以为success成员提供一个T类型的值,并为failure成员提供一个E类型的值。

动态调整枚举成员

Swift的枚举也可以动态地增加、删除和修改成员。这对于需要在运行时改变代码的情况非常有用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
enum LogLevel {
    case verbose
    case warning
    case error
}

if logLevel == .verbose {
    // add debug level
    LogLevel.debug = "debug"
}

switch logLevel {
case .verbose:
    print("Verbose mode")
case .debug:
    print("Debug mode")
case .warning:
    print("Warning mode")
case .error:
    print("Error mode")
}

在这个例子中,我们定义了一个LogLevel枚举,它包含三个成员:verbose、warning和error。在某些情况下,我们可能需要在运行时添加一个新的成员,例如debug。我们可以通过将”debug”字符串赋给LogLevel.debug来动态添加该成员。

本文由作者按照 CC BY 4.0 进行授权

Swift中的闭包

Swift中的类和结构体