协议¶
协议是为方法,属性定义一套规范,没有具体的实现,类似于java中的抽象接口,它只是描述了方法或属性的骨架,而不是实现。 协议可以通过一个类,结构或枚举,来提供协议中要求的具体实现。类,结构体或枚举类型都可以遵循协议,并提供具体实现来完成协议定义的方法和功能。 任意能满足协议要求的类型,都已被称为遵循这个协议。
1. 协议的定义¶
定义协议的语法格式如下所示:
1 2 3 4 | protocol 协议名称
{
// 协议的内容
}
|
协议的定义使用protocol关键字,协议的内容被放置在一对大括号中,在下面的代码中定义了一个名为Walking的协议,该协议拥有一个名为walk的方法:
1 2 3 4 | protocol Walking { func walk() } |
2. 协议的继承¶
协议能狗继承一到多个其它的的协议,多个协议之间需要用逗号 , 分隔。
1 2 3 4 5 | protocol Fighting : Walking { var damage : Int {get set} func fight() } |
这里定义了一个名为Fighting的协议,该协议继承自Walking协议,并且添加了一个协议属性damage和一个协议方法fight。
2. 在类中实现协议¶
要使类遵循某个协议,需要在类的名称后面加上协议名称,中间以冒号:进行分隔,作为类型定义的一部分。当一个类遵循多个协议时,各协议之间用逗号 , 进行分隔。为了使类能够遵循多个协议,这里再次添加了一个名为Eating的协议。
1 2 3 4 | protocol Eating { func eat() } |
接着创建一个名为Animal的类,并遵循两个协议:
1 2 3 4 | class Animal: Fighting, Eating { } |
Animal类遵循Fight和Eating协议,由于Fighting协议继承自Walking协议,说以Animal类共遵循了三个协议:Walking,Fighting,Eating。如果Animal类尚未实现三个协议中的方法,系统会进行错误警告。 如果我们实现三个协议张的内容,将会编译通过。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class Animal: Fighting, Eating { var damage = 10 func walk() { print("I'm walking gracefully!") } func fight() { print("I'm fighting hard!") } func eat() { print("I'm eating happily!") } } |