在 Swift 中,mutating
关键字用于在值类型(如结构体和枚举)的方法中,表明该方法会修改该值类型的实例本身。默认情况下,值类型的实例方法不会改变调用它们的实例的状态,因为值类型在方法调用时会复制一份副本。如果你需要在方法内部改变这个副本(即修改原始实例),就需要使用 mutating
关键字。
使用 mutating
关键字的场景
-
结构体中的方法:
结构体是值类型,默认情况下,结构体方法不会修改原始实例。如果你需要在方法中修改结构体实例的属性,就必须使用mutating
关键字。struct Point { var x: Double var y: Double mutating func moveBy(dx: Double, dy: Double) { x += dx y += dy } } var point = Point(x: 1.0, y: 1.0) point.moveBy(dx: 2.0, dy: 3.0) print(point) // 输出: Point(x: 3.0, y: 4.0)
-
枚举中的方法:
枚举也是值类型,类似地,如果你需要在枚举的方法中修改枚举实例的状态,也需要使用mutating
关键字。enum Counter { case increment var count: Int = 0 mutating func increment() { count += 1 } } var counter = Counter.increment counter.increment() counter.increment() print(counter.count) // 输出: 2
注意事项
-
mutating
关键字不能用于类的方法,因为类是引用类型,其方法默认就可以修改实例本身。 - 在
mutating
方法中,你不能调用非mutating
方法并将结果赋值给self
或其属性,因为这会导致编译错误。 - 你可以在
mutating
方法中调用其他mutating
方法。
示例:复合 mutating
方法
struct Rectangle {
var width: Double
var height: Double
mutating func setWidth(_ width: Double) {
self.width = width
}
mutating func setHeight(_ height: Double) {
self.height = height
}
mutating func resize(byPercentage: Double) {
width *= byPercentage
height *= byPercentage
}
}
var rect = Rectangle(width: 10.0, height: 5.0)
rect.resize(byPercentage: 1.5)
print(rect.width) // 输出: 15.0
print(rect.height) // 输出: 7.5
在这个示例中,setWidth
, setHeight
, 和 resize
方法都使用了 mutating
关键字,因为它们会修改 Rectangle
实例的属性。
总之,mutating
关键字在 Swift 中是处理值类型(结构体和枚举)时的一个重要工具,它允许你在方法内部修改实例的状态。
网友评论