聊聊 iOS 开发中的协议

450 查看

前言

何为协议,简单来说在OC中我们使用关键字@protocol可以声明一个协议,并在协议中添加多个属性、方法供于遵循者实现,从某个角度上来说,这是一种不同于category机制的category。在日常开发中,协议可谓无处不在,最为核心的UITableView通过协议来获取数据、完成事件处理等。下面就是一个最粗浅的协议

对于协议的理解,很多的开发者依旧保留在委托-代理等于协议等认知上。然而前者依赖于后者的实现,而后者即便不通过前者也能完成抽象解耦的工作。在继续谈协议可以完成的工作之前,有必要来理解一下何为协议:

协议指定了一套行为规范,遵循协议的类必须实现对应的行为

协议应用

代理回调

开发中我们几乎都会写的代码一定是UITableView系列的代理和数据源方法。毫无疑问,苹果提供的这个视图是如此的优雅而强大,即便在现在这个数据源方法因代码过多被疯狂吐槽的年代,你依然无法想到其他实现UITableView的更佳实践,这个控件充分向我们展示了委托-代理的强大。

协议最简单直观的应用是委托-代理设计模式,在封装自定义控件的时候,我喜欢使用自定义的协议来完成用户点击等业务处理。个人认为,如果你想要了解代理这一模式,起码要自定义过自己的代理协议:

上面是我曾经自定义过的分段控制器的代理伪实现代码,对于项目开发而言,代理这种回调机制的好处包括不仅于接口目的性强、易于追溯调试等。

什么时候用代理

这里不免就要提到另一个跟Delegate同样实用受欢迎的机制Block。比如常用的分享功能通常使用block进行结果回调:

这样的代码看着很紧凑简洁,如果用Delegate来完成结果回调又是另一种感觉了: