能在方法或函數(shù)內(nèi)部改變實(shí)例類型的方法稱為突變方法。在值類型(Value Type)(譯者注:特指結(jié)構(gòu)體和枚舉)中的的函數(shù)前綴加上mutating關(guān)鍵字來表示該函數(shù)允許改變該實(shí)例和其屬性的類型。 這一變換過程在實(shí)例方法(Instance Methods)章節(jié)中有詳細(xì)描述。
(譯者注:類中的成員為引用類型(Reference Type),可以方便的修改實(shí)例及其屬性的值而無需改變類型;而結(jié)構(gòu)體和枚舉中的成員均為值類型(Value Type),修改變量的值就相當(dāng)于修改變量的類型,而Swift默認(rèn)不允許修改類型,因此需要前置mutating關(guān)鍵字用來表示該函數(shù)中能夠修改類型)
注意: 用
class實(shí)現(xiàn)協(xié)議中的mutating方法時,不用寫mutating關(guān)鍵字;用結(jié)構(gòu)體,枚舉實(shí)現(xiàn)協(xié)議中的mutating方法時,必須寫mutating關(guān)鍵字。
如下所示,Togglable協(xié)議含有toggle函數(shù)。根據(jù)函數(shù)名稱推測,toggle可能用于切換或恢復(fù)某個屬性的狀態(tài)。mutating關(guān)鍵字表示它為突變方法:
protocol Togglable {
mutating func toggle()
}
當(dāng)使用枚舉或結(jié)構(gòu)體來實(shí)現(xiàn)Togglabl協(xié)議時,必須在toggle方法前加上mutating關(guān)鍵字。
如下所示,OnOffSwitch枚舉遵循了Togglable協(xié)議,On,Off兩個成員用于表示當(dāng)前狀態(tài)
enum OnOffSwitch: Togglable {
case Off, On
mutating func toggle() {
switch self {
case Off:
self = On
case On:
self = Off
}
}
}
var lightSwitch = OnOffSwitch.Off
lightSwitch.toggle()
//lightSwitch 現(xiàn)在的值為 .On