Swift 類(lèi)型分為兩種:一種是 value type (值類(lèi)型)咆贬,另外一種是 reference type(引用類(lèi)型)救赐。
- 值類(lèi)型:例如 枚舉尿这、結(jié)構(gòu)體缴阎、元祖
- 引用類(lèi)型: 例如 類(lèi)(class)
在引用類(lèi)型中允瞧,是可以直接在方法中去修改屬性值的(當(dāng)然前提是你的屬性不是用 let 修飾的),如:
class Ninja {
var name : String = "鳴人"
func growUp() {
self.name = "第七代火影"
}
}
但是在值類(lèi)型中蛮拔,如果想要修改屬性值述暂,那么就需要在方法前面去添加 mutating 關(guān)鍵字(如果不添加,就會(huì)報(bào)錯(cuò) Cannot assign to property: 'self' is immutable )建炫,如:
struct Ninja {
var name: String = "鳴人"
mutating func growUp() {
self.name = "第七代火影"
}
}
需要注意的是畦韭,協(xié)議( protocol )不僅可以被 class 實(shí)現(xiàn),也同樣可以被 struct 和 enum 來(lái)實(shí)現(xiàn)肛跌,所以在定義協(xié)議的時(shí)候艺配,需要考慮方法是否可能去修改屬性察郁,然后決定協(xié)議方法是否添加 mutating 關(guān)鍵字,讓自己的設(shè)計(jì)更加合理转唉。
protocol Ninja {
var name: String {get}
mutating func growUp()
}
struct MingRen: Ninja {
var name: String = "鳴人"
mutating func growUp() {
self.name = "第七代火影"
}
}