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中的實現。