美文网首页
swift-POP 面向协议编程

swift-POP 面向协议编程

作者: GitArtOS | 来源:发表于2021-02-08 18:26 被阅读0次
    146997522_150836383425784_1377212199815159368_n.jpg

    面向协议编程的思维,在 Swift开发中非常非常重要!可以说如果你用好了 POP那么你的项目绝对逼格不是一个level下面我们通过解决OOP 问题的思路展开分析

    1. POP 解决横切关注点

    横切关注点 (Cross-Cutting Concerns)那就是我们很难在不同继承关系的类里共用代码! 现在我们通过面向协议的方式,任何遵循协议的,都可以默认添加 name属性以及sayHello()方法!

    protocol GTProtocl {
        /// 协议属性
        var name: String {get}
        /// 协议方法
        func sayHello()
    }
    
    • 但是这里还有一个问题:缺乏实现!如果这样提供声明,我还需要在每一个类里面实现,有很多时候其实这些方法都是共有,不需要太多特定实现
    • 幸好在 WWDC 2015 和Swift 2 发布时,Apple为协议引入了一个新特性一 协议扩展 它为 Swift 语言带来了一次革命性的变化。
    struct GTTeacher: GTProtocl{
        var name: String
        func sayHello() {
            print("你好")
        }
    }
    
    • 通过协议定义,提供实现的入口,遵循协议的类型需要对其进行实现
    • 协议扩展,为入口提供默认实现。根据入口提供额外实现

    这样的操作有什么作用了? 一 万物皆 GT

    // 声明协议
    extension GTCompatible {
        /// Reactive extensions.
        public static var gt: GTRxSwift.Reactive<Self>.Type
        /// Reactive extensions.
        public var gt: GTRxSwift.Reactive<Self>
    }
    // NSObject 实现
    extension NSObject : GTCompatible { }
    
    • 这样完美实现了万物皆GT的特性
    • 然后通过 GTCompatible引申到Reactive 响应式或者结构体
    • 最后通过不断拓展 Reactive 的能力,就能完美切合

    2.POP 解决动态派发安全性

    对于没有实现 GTProtocl 的类型,编译器将返回错误,因此不存在消息误发送的情况;

    // Compiler Error: 
    // 'GTTeacher' does not conform to protocol 'GTProtocl'
    // protocol requires function 'sayHello()'
    

    3. POP 解决菱形缺陷

    最后我们看看多继承。多继承中存在的一个重要问题是菱形缺陷,也就是子类无法确定使用哪个父类的方法。在协议的对应方面,这个问题虽然依然存在,但却是可以唯一安全地确定的。

    这里很遗憾POP解决菱形缺陷 这一点上也存在同样的BUG, 因为多个协议存在相同的协议属性、协议方法,遵循者也是无法确定的!⚠️ 我们在平时开发中一定要尽量规避同名协议遵循问题,我们在模块划分上面一定要做做到彻底,尽管 Swift 还不能很好地处理多个协议的冲突 但是我们可以在协议层功能抽层严格机智处理上浮与下沉功能。

    举个例子
    我们刚刚是不是做了 GTCompatible, 它是我们功能的入口,万物皆GT,进来,那么这层协议只需要提供入口就完毕
    同时提供接口过度能力,把 GTReactiveCompatibleGT过度到 Reactive层

    extension GTReactiveCompatible {
        /// Reactive extensions.
        public static var gt: Reactive<Self>.Type {
            get { return Reactive<Self>.self }
            set {// this enables using Reactive to "mutate" base type }
        }
        /// Reactive extensions.
        public var gt: Reactive<Self> {
            get { return Reactive(self) }
            set { // this enables using Reactive to "mutate" base object }
        }
    }
    
    • Reactive层, 根据业务划分开来,达到逻辑代码下沉效果!
    public struct Reactive<Base> {
        public let base: Base
        public init(_ base: Base) {
            self.base = base
        }
    }
    
    • 根据 Reactive 里面关联的Base 类型来确定不同的响应式功能
    • 比如:extension Reactive where Base: UISwitch其中 UISwitch 可以+ 换成UITableView、UITextField、UIView ...不断业务下沉

    相信到这里你已经感受到了面向协议编程的方便之处,但是还有一个非常重要的特性没有展现出来就是 一 耦合度大大降低,代码分层,逻辑更清晰

    相关文章

      网友评论

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

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