Swift 的Procotol 不僅可以被Class 類實現(xiàn)僚纷,也適合于struct 和enum斑司。 因為這個原因,我們在寫接口給別人用時需要多考慮是否使用mutating關鍵字修飾方法,比如定義為mutating func myMethod()骄崩。Swift的mutating 關鍵字修飾方法是為了能在該方法中修改 Struct和Enum 的變量拔稳,所以如果你沒在接口方法里寫Mutating葛峻,別人如果用Struct 和Enum 來實現(xiàn)這個接口,就不能在方法里改變自己的變量了巴比。比如下面的代碼:
protocol Vehicle{
var numberOfWheels:Int{get}
var color :UIColor{get set}
mutating func changeColor()
}
struct MyCar:Vehicle{
let numberOfWheels:Int=4
var color=UIColor.blueColor()
mutating func changeColor(){
color=UIColor.redColor()
}
}
如果把protocol定義中的mutating 去掉的話术奖,MyCar 就怎么也過不了編譯了:保持現(xiàn)有的代碼不變的話,會報錯說沒有實現(xiàn)接口:如果去掉mutating 的話轻绞,會報錯說不能改變結構體變量采记。
另外,在使用class 來實現(xiàn)帶有mutating 的方法的接口時政勃,具體實現(xiàn)的前面是不需要加mutating 修飾的唧龄,因為class 可以隨意更改自己的成員變量。 所以說在接口中使用mutating 修飾方法奸远,對于class 的實現(xiàn)是完全透明的既棺,可以當做不存在讽挟。