协议(protocol)可以当作函数参数的类型来用

44 阅读1分钟

有如下例子,

protocol Drivable {
    func drive()
}

struct Car: Drivable {
    func drive() {
        print("Car is driving")
    }
}

func testDrive(_ vehicle: Drivable) {
    vehicle.drive()
}

let myCar = Car()
testDrive(myCar) // 输出:Car is driving

这个例子是想说明:协议可以当作函数参数的类型来使用,也就是说,函数也可以接受任何“遵守这个协议”的对象。

以上面这个例子为例:

一、

首先,定义了一个协议,这个协议叫做Drivable,任何类型(结构体、类等)只要“遵守Drivable协议”,就必须实现一个drive()的方法。

二、

定义一个结构体Car,它遵守了这个协议:Car结构体遵守了Drivable,所以它实现了drive()方法。

三、

定义一个函数,参数类型是Drivable:这个函数的参数vehicle是Drivable类型,意思是:任何遵守了Drivable协议的类型都可以穿进来。

四、

实际调用:myCar是一个Car类型,它遵守了Drivable,所以可以作为参数传给testDrive函数。