protocol 中的 mutating

Swift 类型分为两种:一种是 value type (值类型),另外一种是 reference type(引用类型)。

  • 值类型:例如 枚举、结构体、元祖
  • 引用类型: 例如 类(class)
在引用类型中,是可以直接在方法中去修改属性值的(当然前提是你的属性不是用 let 修饰的),如:
class Ninja {
    var name : String = "鸣人"

    func growUp() {
        self.name = "第七代火影"
    }
}
但是在值类型中,如果想要修改属性值,那么就需要在方法前面去添加 mutating 关键字(如果不添加,就会报错 Cannot assign to property: 'self' is immutable ),如:
struct Ninja {
    var name: String = "鸣人"
    
    mutating func growUp() {
        self.name = "第七代火影"
    }
}


需要注意的是,协议( protocol )不仅可以被 class 实现,也同样可以被 struct 和 enum 来实现,所以在定义协议的时候,需要考虑方法是否可能去修改属性,然后决定协议方法是否添加 mutating 关键字,让自己的设计更加合理。
protocol Ninja {
    var name: String {get}
    mutating func growUp()
}


struct MingRen: Ninja {
    var name: String = "鸣人"
    mutating func growUp() {
        self.name = "第七代火影"
    }
}

你可能感兴趣的:(protocol 中的 mutating)