协议在Swift中是有效的契约:它们定义了一组方法和属性,如果一个类型说它遵守协议,那么它必须实现这些方法和属性。这个合同让我们可以灵活地使用不同的类型来解决同一个问题——我们不知道是使用ThingA
还是ThingB
,只要它们都符合Thing
协议。
例如,员工(Employee
)协议可能如下所示:
protocol Employee {
var name: String { get set }
var jobTitle: String { get set }
func doWork()
}
这里面有三件重要的事情。
首先,两个属性后面都有
{get set}
。这意味着一致性类型必须使它们既可获取(可读)又可设置(可写),这反过来意味着如果一个类型说它遵守Employee
协议,它必须使这两个属性变量而不是常量。其次,
doWork()
内部没有代码。协议是定义某些东西应该如何行为的契约,而不提供这些行为的实现。第三,该协议不是类型,这意味着我们不能创建它的实例。但是我们可以创建符合它的类和结构体
比如下方示例:
代码语言:javascript复制struct Executive: Employee {
var name = "Steve Jobs"
var jobTitle = "CEO"
func doWork() {
print("I'm strategizing!")
}
}
struct Manager: Employee {
var name = "Maurice Moss"
var jobTitle = "Head of IT"
func doWork() {
print("I'm turning it off and on again.")
}
}
现在我们有了一个协议和两种符合它的类型,我们可以尝试使用它:
代码语言:javascript复制let staff: [Employee] = [Executive(), Manager()]
for person in staff {
person.doWork()
}
因为这两种类型都遵循Employee
协议——它们实现了该协议的属性和方法——我们可以创建一个Employee
数组并使用该数组中的对象,而不必知道它们的实际类型是什么。
本文来自Hacking with Swift 给 swift 初学者的入门课程 Swift for Complete Beginners 的 Protocols