协议的作用就是把重复的事情抽取出来,以后任何类型只要遵守协议,都可以使用。
如果没有协议,类似的代码需要重复写。
struct Car {
func drive() {
print("🚗 Car is driving")
}
}
struct Bike {
func drive() {
print("🚲 Bike is riding")
}
}
// 分别写两个函数
func testDriveCar(_ car: Car) {
car.drive()
}
func testDriveBike(_ bike: Bike) {
bike.drive()
}
let car = Car()
let bike = Bike()
testDriveCar(car)
testDriveBike(bike)
可以看到,定义了两个结构体,分别写了两个函数,建立了两个实例。
protocol Drivable {
func drive()
}
struct Car: Drivable {
func drive() {
print("🚗 Car is driving")
}
}
struct Bike: Drivable {
func drive() {
print("🚲 Bike is riding")
}
}
func testDrive(_ vehicle: Drivable) {
vehicle.drive()
}
let car = Car()
let bike = Bike()
testDrive(car)
testDrive(bike)
通过定义protocol,让两个结构体都遵循这个协议,只用一个函数,让函数参数遵循这个协议,就省去了再写一个函数的麻烦,毕竟另一个函数基本上都是重复工作。