面向协议(protocol-oriented
)编程,苹果推荐!
主要内容:
- 协议作为类型来使用
- 使用协议来实现多态
- 使用协议扩展
- 为什么使用协议扩展
协议扩展是苹果新的面向协议编程的支柱,是Swift编程语言最重要的特定之一。使用协议扩展,我们能够为遵守协议的任何类型提供方法与属性实现。
协议作为类型
在Swift编程语言中,协议可以被看作为一种类型,像其他任何类型那样使用。这意味着协议可以作为函数的参数类型或者返回值类型。我们也可以使用它们来作为变量、常量与集合的类型
protocol PersonProtocol {
var firstName: String {get set}
var lastName: String {get set}
var birthDate: NSDate {get set}
var profession: String {get}
init (firstName: String,lastName: String,birthDate: NSDate)
}
func updatePerson(person: PersonProtocol) -> PersonProtocol {
return person
}
var myPerson: PersonProtocol
var people: [PersonProtocol] = []
使用协议实现多态
在编程语言中,多态是多种类型的单一接口(polymorphism is a single interface to multiple types(many forms)
)。之前的例子中,单一的接口是PersonProtocol
协议,而多种类型是遵守该协议的任何类型。
当使用协议来获取实例时,只能使用定义在该协议中的属性与方法。如果想要使用特定个体类型中的属性或方法,需要将实例映射到那个类型。
协议中的类型映射
类型映射(type casting
)是检查实例类型与将实例看作特定类型的方式。在Swift中,is
关键字用来检查实例是否是特定类型,as
关键字用来将实例看作特定类型。
for person in people {
if person is SwiftProgrammer {
}
}
for person in people {
switch (person) {
case is SwiftProgrammer:
case is FootballPlayer:
default:
}
}
协议扩展
协议扩展允许我们扩展协议来为遵守协议的类型提供方法与属性实现,它们也允许我们为所有遵守协议的类型提供普通的实现来减少为每个单独类型提供实现的需要或者创建类层次的需要。
一旦在协议中定义方法(只能在协议中定义方法,而不能实现方法),那么必须要在遵守协议的每个类型中对方法进行实现:
protocol DogProtocol {
var name: String {get set}
var color: String {get set}
func walk() -> String
}
struct JackRussel: DogProtocol {
var name: String
var color: String
func walk() -> String {
return "jackRussel walks"
}
}
我们可以在协议之外定义方法,并且定义它的默认行为:
protocol DogProtocol {
var name: String {get set}
var color: String {get set}
}
extension DogProtocol {
func speak() -> String {
return "Animal speak"
}
}