Swift —— protocol的動態特性

protocolChef {
    func makeFood()
}


extension Chef {
    func makeFood() {
        print("Make Food")
    }
}


struct SeafoodChef:Chef{
    func makeFood(){
        print("Cook Seafood")    
    }
}

let chefOne:Chef = SeafoodChef()
let chefTwo:SeafoodChef = SeafoodChef()
chefOne.makeFood()
chefTwo.makeFood()

上面代碼打印出兩行:“Cook Seafood”。

在Swift中,協議中是動態派發,擴展中是靜態派發。也就是說,協議中如果有方法聲明,那麼方法會根據對象的實際類型進行調用。

此題中的makeFood()方法在Chef協議中已經聲明瞭,而chefOne雖然聲明爲Chef,但實際實現爲SeaFoodChef。所以,根據實際情況,makeFood()會調用SeaFoodChef中的實現。chefTwo也是同樣的道理。

如果Protocol中沒有聲明makeFood()方法,代碼會輸出什麼?

代碼會打印兩行結果,第一行爲"Make Food" 第二行爲"Cook Seafood"。

因爲協議中沒有聲明makeFood()方法,所以,此時只會按照擴展中的聲明類型進行靜態派發。也就是說,會根據對象的聲明類型進行調用。cheOne被聲明爲Chef,所以調用擴展中的實現,cheTwo被聲明爲SeafoodChef,所以調用SeafoodChef中的實現。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章