Swift — 关键字 mutating

在 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 结构体的 xy 属性。由于这是一个 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 的方法可以修改实例的属性或改变实例本身(例如枚举切换值)。

相关文档 #

本文共 778 字,上次修改于 Dec 16, 2024