Swift 100Tips_2 將Protocol 的方法聲明為Mutating

Swift 的Procotol 不僅可以被Class 類實(shí)現(xiàn),也適合于struct 和enum。 因?yàn)檫@個(gè)原因,我們?cè)趯懡涌诮o別人用時(shí)需要多考慮是否使用mutating關(guān)鍵字修飾方法,比如定義為mutating func myMethod()。Swift的mutating 關(guān)鍵字修飾方法是為了能在該方法中修改 Struct和Enum 的變量,所以如果你沒(méi)在接口方法里寫Mutating,別人如果用Struct 和Enum 來(lái)實(shí)現(xiàn)這個(gè)接口,就不能在方法里改變自己的變量了。比如下面的代碼:

 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 就怎么也過(guò)不了編譯了:保持現(xiàn)有的代碼不變的話,會(huì)報(bào)錯(cuò)說(shuō)沒(méi)有實(shí)現(xiàn)接口:如果去掉mutating 的話,會(huì)報(bào)錯(cuò)說(shuō)不能改變結(jié)構(gòu)體變量。
另外,在使用class 來(lái)實(shí)現(xiàn)帶有mutating 的方法的接口時(shí),具體實(shí)現(xiàn)的前面是不需要加mutating 修飾的,因?yàn)閏lass 可以隨意更改自己的成員變量。 所以說(shuō)在接口中使用mutating 修飾方法,對(duì)于class 的實(shí)現(xiàn)是完全透明的,可以當(dāng)做不存在。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容