美文网首页
面向协议编程

面向协议编程

作者: 彡廿 | 来源:发表于2017-04-21 15: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的对象调用

    相关文章

      网友评论

          本文标题:面向协议编程

          本文链接:https://www.haomeiwen.com/subject/fhrdzttx.html