博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面向协议编程
阅读量:4295 次
发布时间:2019-05-27

本文共 2993 字,大约阅读时间需要 9 分钟。

面向协议编程

在使用 Swift 时,可以为结构体和枚举类型声明方法,其使用起来更加方便,对于一些简单模型,或者对象的组合模型,使用结构体更为简便。

对于面向对象编程(OOP,Object Oriented Programming)而言,类能够更好的描述模型,并且可以将抽象出的通用属定义在父类中。

但是,不管是 Objective-C 还是 Swift 语言,都不支持多继承,但是他们都可以遵循多个协议。实际编程时,可以将不同的特性分类,定义在不同的协议中,然后通过遵循协议的方式来实现一类特性。

在 Objective-C 中,值类型既不继承其他类型,也不能实现协议。如果要更多的使用值类型,那么抽象出通用的属性给不同值类型继承,就十分必要。而 Swift 做得更多,所有的类型都可以遵循多个协议,而且协议本身可以实现默认的方法,如此,针对一类操作定义一个协议,那么只要遵循该协议,就可以获得相应操作。

如同一个孩子的发质继承自父亲,而眼睛更像母亲,那么如果使用面向对象的方式进行描述,无法支持多继承的情况下,只能冗余的将特性既声明在父类中又声明在子类中。而如果将特性声明在协议中,父类和子类遵循相同的协议就表示拥有同一个特质,而子类再遵循一个描述母亲眼睛特性的协议即可。

所以,面向协议编程(POP,Protocol Oriented Programming)是通过不同协议的继承和组合来描述事物。可以说,面向对象更多的是对一类事物通用特性的抽象,而面向协议更多的是对不同事物通用特性的抽象。前者更注重整体特性的抽象,后者是对特性更细粒度的抽象。通过不同特性的组合来描述一类事物,比通过层层继承来描述一类事物更加简化,更加具体,代码冗余度也会下降。

例如,在应用架构的设计时,也可以使用面向协议编程的思想,我们可以将以前写入基类中的一些属性或方法,定义在协议中,通过遵循协议来使相应的类型获得需要的属性或方法。

protocol HXJRootProtocol: NSObject {        var isSafeContentViewEnable: Bool { get set }        var safeContentView: UIView! { get }}extension UIViewController: HXJRootProtocol {        private static let safeContentViewTag: Int = 1000        var safeContentView: UIView! {        assert(isSafeContentViewEnable, "需要先设置 isSafeContentViewEnable 为 true 才可以使用 safeContentView")        if let view = view.viewWithTag(UIViewController.safeContentViewTag) {            return view        }        return nil    }            var isSafeContentViewEnable: Bool {        set {            if newValue {                if nil != view.viewWithTag(UIViewController.safeContentViewTag) { return }                addSafeContentView()            }else {                if let view = view.viewWithTag(UIViewController.safeContentViewTag) {                    view.removeFromSuperview()                }            }        }                get {            return view.viewWithTag(UIViewController.safeContentViewTag) != nil        }    }        private func addSafeContentView() {                let safeContentView = UIView.init()        view.addSubview(safeContentView)                safeContentView.backgroundColor = .clear        safeContentView.tag = UIViewController.safeContentViewTag        safeContentView.translatesAutoresizingMaskIntoConstraints = false                safeContentView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true        safeContentView.rightAnchor.constraint(equalTo: self.view.rightAnchor).isActive = true                if #available(iOS 11.0, *) {            safeContentView.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true            safeContentView.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor).isActive = true        } else {            safeContentView.topAnchor.constraint(equalTo: self.topLayoutGuide.bottomAnchor).isActive = true            safeContentView.bottomAnchor.constraint(equalTo: self.bottomLayoutGuide.topAnchor).isActive = true        }    }        }

在上面的代码中,通过使 UIViewController 遵循 HXJRootProtocol 协议,来添加一个安全区域的视图。

虽然无法为一个类型扩展存储属性,但是如果有必要,可以使用运行时的方法来实现该需求。

转载地址:http://vpdws.baihongyu.com/

你可能感兴趣的文章
已知子网掩码,确定ip地址范围
查看>>
判断时间或者数字是否连续
查看>>
docker-daemon.json各配置详解
查看>>
Mac 下docker路径 /var/lib/docker不存在问题
查看>>
Docker(一)使用阿里云容器镜像服务
查看>>
Docker(二) 基础命令
查看>>
Docker(三) 构建镜像
查看>>
Spring 全家桶注解一览
查看>>
JDK1.8-Stream API使用
查看>>
cant connect to local MySQL server through socket /tmp/mysql.sock (2)
查看>>
vue中的状态管理 vuex store
查看>>
Maven之阿里云镜像仓库配置
查看>>
Maven:mirror和repository 区别
查看>>
微服务网关 Spring Cloud Gateway
查看>>
SpringCloud Feign的使用方式(一)
查看>>
SpringCloud Feign的使用方式(二)
查看>>
关于Vue-cli+ElementUI项目 打包时排除Vue和ElementUI
查看>>
Vue 路由懒加载根据根路由合并chunk块
查看>>
vue中 不更新视图 四种解决方法
查看>>
MySQL 查看执行计划
查看>>