swift的protocol可以被class,struct,enum类型实现,如果没在协议的方法里写mutating,例如mutating func method(),如果使用者用struct或enum实现这个协议,就不能在方法里改变自己的变量了。而mutating对于class类型来说没有影响,可以当做是透明的。
protocol Vehicle
{
var numberOfWheels: Int {get}
var color: UIColor {get set}
mutating func changeColor()
}
struct MyCar: Vehicle {
let numberOfWheels = 4
var color = UIColor.blue
mutating func changeColor() {
// 因为 `color` 的类型是 `UIColor`,这里直接写 .red 就足以推断类型了
color = .red
}
}
如果把 protocol 定义中的 mutating 去掉的话,MyCar 就怎么都过不了编译了:保持现有代码不变的话,会报错说没有实现协议;如果去掉 mutating 的话,会报错说不能改变结构体成员。