將 protocol 的方法聲明為 mutating

Swift 的 protocol 不僅可以被 class 類型實(shí)現(xiàn),也適用于 struct 和 enum。因?yàn)檫@個(gè)原因,我們?cè)趯?xiě)給別人用的接口時(shí)需要多考慮是否使用 mutating 來(lái)修飾方法,比如定義為 mutating func myMethod()。Swift 的 mutating 關(guān)鍵字修飾方法是為了能在該方法中修改 struct 或是 enum 的變量,所以如果你沒(méi)在接口方法里寫(xiě) 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 = 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)體成員。這個(gè)接口的使用者的憂傷的眼神,相信你能想象得出。

另外,在使用 class 來(lái)實(shí)現(xiàn)帶有 mutating 的方法的接口時(shí),具體實(shí)現(xiàn)的前面是不需要加 mutating 修飾的,因?yàn)?class 可以隨意更改自己的成員變量。所以說(shuō)在接口里用 mutating 修飾方法,對(duì)于 class 的實(shí)現(xiàn)是完全透明,可以當(dāng)作不存在的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容