Swift Protocol Extension Default Implemention

前言

昨天碰到一个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"。

这里有张图,比较清楚的解释了方法的调用。

Swift Protocol Extension Default Implemention_第1张图片
call.png

后语

  1. 当声明的类型为protocol时,若调用的方法在protocol中声明,则走动态调用,该是啥就是啥。
  2. 当声明的类型为protocol时,若调用的方法未在protocol中声明但有默认实现,则走默认实现。
  3. 当声明类型非protocol,走动态调用。

你可能感兴趣的:(Swift Protocol Extension Default Implemention)