Swift入门:协议

2020-03-19 20:46:14 浏览数 (1)

协议在Swift中是有效的契约:它们定义了一组方法和属性,如果一个类型说它遵守协议,那么它必须实现这些方法和属性。这个合同让我们可以灵活地使用不同的类型来解决同一个问题——我们不知道是使用ThingA还是ThingB,只要它们都符合Thing协议。

例如,员工(Employee)协议可能如下所示:

代码语言:javascript复制
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

0 人点赞