Swift —— protocol的動態特性
阿新 • • 發佈:2018-12-10
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中的實現。