美文网首页设计模式
Swift -- 面向协议编程

Swift -- 面向协议编程

作者: 冰棍儿好烫嘴 | 来源:发表于2022-02-09 14:37 被阅读0次

    面向协议编程(Protocol Oriented Programming,简称POP)

    • 是Swift的一种编程范式,Apple于2015年WWDC提出
    • 在Swift的标准库中,能见到大量POP的影子
    @frozen public struct Int : FixedWidthInteger, SignedInteger//Int的源码定义
    

    同时,Swift也是一门面向对象的编程语言(Object Oriented Programming,简称OOP)

    • 在Swift开发中,OOP和POP是相辅相成的,任何一方并不能取代另一方

    POP能弥补OOP一些设计上的不足

    OOP的三大特性:封装、继承、多态

    • 继承的经典使用场合
      - 当多个类(比如A、B、C类)具有很多共性时,可以将这些共性抽取到一个父类中(比如D类),最后A、B、C类继承D类

    但有些问题,使用OOP并不能很好解决,比如:如何将BVC、DVC的公共方法run抽取出来?

    class BVC: UIViewController {
        func run(){
            print("run")
        }
    }
    
    class DVC: UITableViewController {
        func run(){
            print("run")
        }
    }
    
    • 基于OOP想到的一些解决方案:
      - 将run方法放到另一个对象A中,然后BVC、DVC拥有对象A属性:多了一些额外的依赖关系
      - 将run方法增加到UIViewController分类中:UIViewController会越来越臃肿,而且会影响它的其他所有子类
      - 将run方法抽取到新的父类,采用多继承?(c++支持多继承,oc是不支持多继承的):会增加程序设计复杂度,产生菱形继承等问题,需要开发者额外解决
    protocol Runnable {
        func run()
    }
    extension Runnable{
        func run()  {
            print("run")
        }
    }
    class BVC: UIViewController,Runnable {}
    class DVC: UITableViewController,Runnable{}
    

    POP的注意点:

    • 优先考虑创建协议,而不是父类(基类)
    • 优先考虑值类型(structenum),而不是引用类型(class
    • 巧用协议的扩展功能 entension
    • 不要为了面向协议而使用协议

    相关文章

      网友评论

        本文标题:Swift -- 面向协议编程

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