面向协议编程
什么是协议 (Protocol)
协议:就是一组属性/方法的定义。
某个类要遵守一个协议,就要实现这个协议所定义的这些内容。协议所走的事情就是“关于实现的约定”。
1.定义一个协议:
protocol Greetable {
// 协议属性
var name: String { get }
// 协议方法
func doWork()
}
2.遵守并实现协议的约定
// 遵守协议
class Person: Greetable {
var name: String = "Person"
func doWork() {
print("撸代码了")
}
}
class Dog: Greetable {
var name: String = "dog"
func doWork() {
print("吃屎了")
}
}
3.遵守并实现协议的属性和方法后,就可以直接使用协议的属性和方法
let person = Person()
print(person.name)
person.doWork()
let dog = Dog()
print(dog.name)
dog.doWork()
输出结果:
Paste_Image.png
协议的默认实现(swift2.0以后增加了协议的默认实现)
extension Greetable{
var name: String {
return "animal"
}
func doWork() {
print("啪啪啪")
}
}
有默认实现的协议,在遵守的时候可以不用再去实现属性和方法,而可以直接去调用属性和方法
class Cat: Greetable {
}
调用属性和方法
let cat = Cat()
print(cat.name)
cat.doWork()
Paste_Image.png
扩展中默认实现的限定
extension Greetable where Self: Person {
var name: String {
return "animal"
}
func doWork() {
print("啪啪啪")
}
}
此时限定了协议的默认实现只能在Person
类中使用,其他类遵守协议就一定要实现协议。
结论:
1.遵守协议的类就要实现协议的属性和方法,实现之后可以直接调用。
2.如果协议的属性和方法在扩在中默认实现。遵守的类可以不必再去实现,而直接调用属性和方法。
3.协议已经默认实现,遵守的类又实现了属性和方法,按照新实现的属性和方法为准。
4.extension Protocol1 where Self: 类1 限定了协议Protocol1的扩展实现,只能由类1的对象调用