前言
昨天碰到一個protocol extension method的調(diào)用的問題,發(fā)現(xiàn)我給理解反了,后來查了下資料,整理總結(jié)下。
定義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的變量,沒有輸出默認(rèn)的extension實現(xiàn)。
但是將protocol中的方法注釋掉,car1的輸出是"default make car"。
這里有張圖,比較清楚的解釋了方法的調(diào)用。

call.png
后語
- 當(dāng)聲明的類型為protocol時,若調(diào)用的方法在protocol中聲明,則走動態(tài)調(diào)用,該是啥就是啥。
- 當(dāng)聲明的類型為protocol時,若調(diào)用的方法未在protocol中聲明但有默認(rèn)實現(xiàn),則走默認(rèn)實現(xiàn)。
- 當(dāng)聲明類型非protocol,走動態(tài)調(diào)用。