Swift 的 protocol 不僅可以被 class 類型實(shí)現(xiàn)竖慧,也適用于 struct 和 enum寿谴。因?yàn)檫@個(gè)原因惕澎,我們?cè)趯懡o別人用的接口時(shí)需要多考慮是否使用 mutating 來修飾方法槐瑞,比如定義為 mutating func myMethod()据过。Swift 的 mutating 關(guān)鍵字修飾方法是為了能在該方法中修改 struct 或是 enum 的變量栖博,所以如果你沒在接口方法里寫 mutating 的話屑宠,別人如果用 struct 或者 enum 來實(shí)現(xiàn)這個(gè)接口的話,就不能在方法里改變自己的變量了仇让。比如下面的代碼
protocol Vehicle
{
var numberOfWheels: Int {get}
var color: UIColor {get set}
mutating func changeColor()
}
struct MyCar: Vehicle {
let numberOfWheels = 4
var color = UIColor.blueColor()
mutating func changeColor() {
color = UIColor.redColor()
}
}
如果把 protocol 定義中的 mutating 去掉的話典奉,MyCar 就怎么都過不了編譯了:保持現(xiàn)有代碼不變的話躺翻,會(huì)報(bào)錯(cuò)說沒有實(shí)現(xiàn)接口;如果去掉 mutating 的話秋柄,會(huì)報(bào)錯(cuò)說不能改變結(jié)構(gòu)體成員获枝。這個(gè)接口的使用者的憂傷的眼神,相信你能想象得出骇笔。
另外省店,在使用 class 來實(shí)現(xiàn)帶有 mutating 的方法的接口時(shí),具體實(shí)現(xiàn)的前面是不需要加 mutating 修飾的笨触,因?yàn)?class 可以隨意更改自己的成員變量懦傍。所以說在接口里用 mutating 修飾方法,對(duì)于 class 的實(shí)現(xiàn)是完全透明芦劣,可以當(dāng)作不存在的粗俱。