Swift中的协议
提示
- 协议的基本定义:在Swift中,协议定义了类或其他类型应实现的方法或属性蓝图,使用
protocol
关键字定义。 - 类遵守协议:类通过实现协议规定的方法或属性来遵守协议,如同提供了这些方法或属性的实际实现。
- 协议的扩展和继承:Swift允许协议继承其他协议,增加新的要求;同时可以通过扩展为协议提供默认实现。
在 Swift 中,协议定义了一系列可被类(或其他类型)采用的方法或属性的蓝图。
我们使用 protocol
关键字来定义协议。例如,
protocol Greet {
// 属性的蓝图
var name: String { get }
// 方法的蓝图
func message()
}
这里,
Greet
- 协议的名称name
- 一个可获取的属性message()
- 方法定义,没有任何实现
注意:
- 协议只包含方法或属性的定义,而不是它们的实际实现。
- 协议必须指定属性是可获取的还是可设置和可获取的。
使类遵守 Swift 协议
在 Swift 中,要使用协议,其他类必须遵守它。当我们使一个类遵守协议后,我们必须提供方法的实际实现。
以下是使类遵守协议的方法,
// 使类遵守 Greet 协议
class Employee: Greet {
// 实现属性
var name = "Perry"
// 实现方法
func message() {
print("早上好!")
}
}
这里,我们使 Employee
类遵守了 Greet
协议。因此,我们必须提供 name
属性和 message()
方法的实现。
示例 1:Swift 协议
protocol Greet {
// 属性的蓝图
var name: String { get }
// 方法的蓝图
func message()
}
// 使类遵守 Greet 协议
class Employee: Greet {
// 实现属性
var name = "Perry"
// 实现方法
func message() {
print("早上好", name)
}
}
var employee1 = Employee()
employee1.message()
输出
早上好 Perry
在上述示例中,我们创建了一个名为 Greet
的协议。协议包含了 name
属性和 message()
方法的蓝图。
这里,Employee
类遵守了 Greet
并提供了 name
和 message()
的实际实现。
示例 2:用 Swift 协议计算面积
protocol Polygon {
func getArea(length: Int, breadth: Int)
}
// 使类遵守 Polygon 协议
class Rectangle: Polygon {
// 实现方法
func getArea(length: Int, breadth: Int) {
print("矩形的面积:", length * breadth)
}
}
// 创建一个对象
var r1 = Rectangle()
r1.getArea(length:5, breadth: 6)
输出
矩形的面积: 30
在上述示例中,我们创建了一个名为 Polygon
的协议。协议包含了带有两个参数 length
和 breadth
的 getArea()
方法的蓝图。
这里,Rectangle
类遵循了 Polygon
协议并提供了 getArea()
方法的实际实现。
func getArea(length: Int, breadth: Int) {
print("矩形的面积:", length * breadth)
}
遵循多个协议
在 Swift 中,一个类也可以遵循多个协议。例如,
protocol Sum {
...
}
protocol Multiplication {
...
}
class Calculate: Sum, Multiplication {
...
}