在 Swift 中,mutating
关键字用于标记能改变结构体 struct
或枚举 enum
实例中属性的方法。Swift 中的结构体和枚举是值类型,而类 class
是引用类型。值类型的实例方法默认情况下不能修改实例的属性,因为它们是被拷贝的。为了允许修改,需要在方法前添加 mutating
关键字。
结构体中的 mutating
方法
#
当你在结构体中定义一个方法,并且该方法需要修改结构体的属性时,就需要将该方法标记为 mutating
。例如:
struct Point {
var x: Int
var y: Int
mutating func moveBy(dx: Int, dy: Int) {
x += dx
y += dy
}
}
var point = Point(x: 0, y: 0)
point.moveBy(dx: 5, dy: 3)
print("Point is now at (\(point.x), \(point.y))") // 输出: Point is now at (5, 3)
在这个例子中,moveBy(dx:dy:)
方法修改 Point
结构体的 x
和 y
属性。由于这是一个 mutating
方法,因此我们可以在方法中修改这些属性。
枚举中的 mutating
方法
#
同样的,枚举中的方法如果修改实例(比如切换到另一个枚举值),也必须标记为 mutating
:
enum LightSwitch {
case off, on
mutating func toggle() {
switch self {
case .off:
self = .on
case .on:
self = .off
}
}
}
var lightSwitch = LightSwitch.off
lightSwitch.toggle() // 使用 mutating 方法来切换状态
print(lightSwitch) // 输出: on
在这个例子中,toggle
方法改变了 LightSwitch
实例的状态,因为它是一个 mutating
方法。
举个例子 #
定义一个可以修改内部属性的方法:
struct MyStruct {
var property: Int
mutating func changeProperty(newValue: Int) {
property = newValue
}
}
enum MyEnum {
case firstCase, secondCase
mutating func toggleCase() {
switch self {
case .firstCase:
self = .secondCase
case .secondCase:
self = .firstCase
}
}
}
通过使用 mutating
关键字,结构体和枚举中的方法可以成功修改实例的内部状态。
为什么需要 mutating
#
mutating
关键字存在的原因在于结构体和枚举是值类型。在 Swift 中,当你改变一个值类型的属性时,本质上是在改变值的副本。为了使得方法可以合法地改变实例内部的状态,必须显式地标记这个方法为 mutating
。这能够明确方法可能会改变实例的自身属性,有助于代码的可读性和安全性。
小结 #
mutating
关键字 用于标记那些修改结构体或枚举实例中属性的方法。- 值类型 结构体和枚举是值类型,因此默认情况下,其方法不能改变实例自身的状态。
- 修改属性 标记为
mutating
的方法可以修改实例的属性或改变实例本身(例如枚举切换值)。