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 = "第七代火影"
}
}