1. 程式人生 > >Swift —— protocol的動態特性

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