前言
昨天碰到一個protocol extension method的調用的問題疫蔓,發(fā)現(xiàn)我給理解反了粘衬,后來查了下資料,整理總結下新娜。
定義protocol
protocol MakeCar {
func makeCar()
}
extension MakeCar {
func makeCar() {
print("default make car")
}
}
class Creator: MakeCar {
func makeCar() {
print("custom make car")
}
}
// type is Protocol
let car1: MakeCar = Creator()
// type is Class
let car2: Creator = Creator()
print(car1.makeCar())
print(car2.makeCar())
輸出:
custom make car
custom make car
聲明為Protocol的變量桅滋,沒有輸出默認的extension實現(xiàn)慧耍。
但是將protocol中的方法注釋掉身辨,car1的輸出是"default make car"。
這里有張圖芍碧,比較清楚的解釋了方法的調用煌珊。
call.png
后語
- 當聲明的類型為protocol時,若調用的方法在protocol中聲明泌豆,則走動態(tài)調用定庵,該是啥就是啥。
- 當聲明的類型為protocol時践美,若調用的方法未在protocol中聲明但有默認實現(xiàn)洗贰,則走默認實現(xiàn)。
- 當聲明類型非protocol陨倡,走動態(tài)調用敛滋。