27 协议与扩展之协议的定义

在上一章中,我们讨论了如何在 Swift 中自定义错误类型,以处理程序中的错误情况。现在,我们将进入协议的世界,了解如何定义和使用协议。协议是一种非常强大的功能,它允许我们定义一组方法和属性,任何遵循该协议的类型都必须实现这些方法和属性。通过协议,我们能够实现代码的重用以及不同类型之间的一致性。

协议的定义

在 Swift 中,协议通过 protocol 关键字定义。一个协议可以包含方法、属性和其他协议的定义。下面是一个简单的协议的定义示例:

1
2
3
4
5
protocol Vehicle {
var numberOfWheels: Int { get }
func startEngine()
func stopEngine()
}

在这个示例中,我们定义了一个 Vehicle 协议,它包含一个只读属性 numberOfWheels 和两个方法 startEngine()stopEngine()。任何遵循此协议的类型都必须实现这些要求。

遵循协议

要让一个类、结构体或枚举遵循某个协议,需要在类型声明中使用协议名称。以下是一个类实现 Vehicle 协议的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
class Car: Vehicle {
var numberOfWheels: Int {
return 4
}

func startEngine() {
print("Engine started.")
}

func stopEngine() {
print("Engine stopped.")
}
}

在这个例子中,Car 类实现了 Vehicle 协议,提供了 numberOfWheels 的具体值和两个方法的实现。

协议的属性要求

协议中的属性可以是可读或可写的。可读属性只需要声明,而可写属性则需要同时声明 getset。比如,下面我们为 Vehicle 协议添加一个可写属性:

1
2
3
4
5
6
protocol Vehicle {
var numberOfWheels: Int { get }
var color: String { get set }
func startEngine()
func stopEngine()
}

在遵循这个协议时,类需要实现 color 属性的 getset 方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Motorcycle: Vehicle {
var numberOfWheels: Int {
return 2
}

var color: String = "Red"

func startEngine() {
print("Motorcycle engine started.")
}

func stopEngine() {
print("Motorcycle engine stopped.")
}
}

协议的继承

协议可以继承其他协议,这样我们可以构建出层次化的协议体系,增加代码的复用性。下一章我们将深入探讨协议的继承。在此之前,先给出一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
protocol LandVehicle: Vehicle {
var terrainType: String { get }
}

class Truck: LandVehicle {
var numberOfWheels: Int {
return 6
}

var terrainType: String {
return "Off-road"
}

var color: String = "Blue"

func startEngine() {
print("Truck engine started.")
}

func stopEngine() {
print("Truck engine stopped.")
}
}

在这个例子中,我们定义了 LandVehicle 协议,它继承了 Vehicle 协议,要求任何遵循 LandVehicle 协议的类型也必须实现 Vehicle 中的要求。在 Truck 类中,我们实现了所有的属性和方法。

总结

在本章中,我们深入探讨了协议的定义以及如何让类型遵循协议。我们通过实例演示了如何实现协议的属性和方法要求,以及如何构建继承关系,使协议的使用更加灵活和强大。希望这些内容为你在日后的 Swift 编程中提供帮助。

接下来的章节,我们将继续讨论协议的继承,深入理解如何构建复杂的协议体系。

27 协议与扩展之协议的定义

https://zglg.work/swift-lang-zero/27/

作者

IT教程网(郭震)

发布于

2024-08-15

更新于

2024-08-16

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论