前言
昨天碰到一个protocol extension method的调用的问题,发现我给理解反了,后来查了下资料,整理总结下。
定义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实现。
但是将protocol中的方法注释掉,car1的输出是"default make car"。
这里有张图,比较清楚的解释了方法的调用。
call.png后语
- 当声明的类型为protocol时,若调用的方法在protocol中声明,则走动态调用,该是啥就是啥。
- 当声明的类型为protocol时,若调用的方法未在protocol中声明但有默认实现,则走默认实现。
- 当声明类型非protocol,走动态调用。
网友评论