Swift 中的枚举(enum)和结构体(struct)是定义和组织数据的核心工具。枚举适用于定义一组相关的常量,而结构体用于定义数据的组合类型。本章将详细介绍这两种类型及其在 Swift 中的用法。
6.1 枚举(Enum)
枚举用于定义一组相关的值。例如,可以用枚举来定义星期几、交通信号灯等状态。Swift 中的枚举功能十分强大,支持关联值和原始值,还可以定义方法。
基本定义
enum CompassPoint {
case north
case south
case east
case west
}
var direction = CompassPoint.north
direction = .east // 省略类型名称
switch 语句与枚举
可以结合 switch 语句来处理枚举的不同情况。
switch direction {
case .north:
print("Heading north")
case .south:
print("Heading south")
case .east:
print("Heading east")
case .west:
print("Heading west")
}
6.2 原始值枚举
枚举可以赋予原始值,原始值可以是 Int、String 或其他基本类型。定义了原始值后,可以通过 rawValue 属性访问。
enum Planet: Int {
case mercury = 1
case venus
case earth
case mars
}
let earth = Planet.earth
print(earth.rawValue) // 输出:3
6.3 关联值枚举
关联值允许每个枚举成员携带不同类型的值,这种方式非常适合表达具有额外数据的信息,如网络请求的结果。
enum Barcode {
case upc(Int, Int, Int, Int)
case qrCode(String)
}
var productCode = Barcode.upc(8, 85909, 51226, 3)
productCode = .qrCode("1234567890")
switch productCode {
case .upc(let numberSystem, let manufacturer, let product, let check):
print("UPC: \(numberSystem), \(manufacturer), \(product), \(check)")
case .qrCode(let code):
print("QR code: \(code)")
}
6.4 结构体(Struct)
结构体是用来定义数据模型的类型,通常用于封装多个数据字段。Swift 的结构体功能强大,支持构造函数、方法和属性,可以帮助组织和管理代码。
基本定义
struct Person {
var name: String
var age: Int
}
let john = Person(name: "John", age: 30)
print(john.name) // 输出:"John"
结构体的可变性
结构体默认是不可变的。如果要修改结构体的属性,必须用 var 定义它,或在属性方法前加上 mutating 关键字。
var person = Person(name: "Alice", age: 25)
person.age = 26 // 可修改
// 在方法中修改属性
struct Point {
var x: Int
var y: Int
mutating func moveBy(x deltaX: Int, y deltaY: Int) {
x += deltaX
y += deltaY
}
}
var point = Point(x: 0, y: 0)
point.moveBy(x: 10, y: 20)
print(point) // 输出:"Point(x: 10, y: 20)"
6.5 枚举和结构体的方法
Swift 中的枚举和结构体都可以定义方法,方法可以操作和处理实例数据。
示例代码
enum TrafficLight {
case red, yellow, green
func description() -> String {
switch self {
case .red:
return "Stop"
case .yellow:
return "Caution"
case .green:
return "Go"
}
}
}
let light = TrafficLight.red
print(light.description()) // 输出:"Stop"
struct Rectangle {
var width: Double
var height: Double
func area() -> Double {
return width * height
}
}
let rect = Rectangle(width: 5.0, height: 10.0)
print("Area: \(rect.area())") // 输出:"Area: 50.0"
6.6 值类型与引用类型的区别
Swift 中的结构体和枚举是值类型,当它们被赋值或传递时,会进行值拷贝。而类(class)是引用类型,赋值或传递时不会拷贝,而是指向同一实例。
struct Point {
var x: Int
var y: Int
}
var pointA = Point(x: 0, y: 0)
var pointB = pointA
pointB.x = 10
print(pointA.x) // 输出:0
print(pointB.x) // 输出:10
在上例中,修改 pointB 不会影响 pointA,因为它们是独立的拷贝。
通过本章的学习,你已经掌握了 Swift 中枚举和结构体的定义、使用以及它们的值类型特性。下一章我们将探讨 Swift 中的类和对象导向编程的基本概念。