面向协议编程

2017-04-21  本文已影响15人  彡廿

面向协议编程

什么是协议 (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的对象调用

上一篇 下一篇

猜你喜欢

热点阅读