Swift&Objective-C首页投稿(暂停使用,暂停投稿)程序员

解读协议(Protocol)

2016-08-20  本文已影响1012人  查无此人123

写在前面

定义

一句话定义: 协议是方法声明的集合

详细解释:

swift里的协议没有现实生活中的那么复杂,这里的协议就是声明了一堆方法(计算属性也算),这些方法是我想找人来帮我做的事,有些事我不求结果,有些事情我希望你做完了以后,给我一个反馈,这个反馈结果可能是要确定ok还是不ok,也可能我要一个确定的东西(字符串,字符,数字,或是某个类的对象,某个结构体的对象,某个枚举的对象,也可能是一个函数)

补充: protocol 可以被类(class),结构体(structure),枚举(enumeration)遵循.

语法

声明语法

protocol SomeProtocol: class { /* ..省略.. */ }

定义了一个只允许class遵循的协议,名字叫做SomeProtocol.也可以写成只允许结构体或者枚举遵循,只需在协议名后写: struct : enum

遵循语法

class SomeClass: SomeSuperclass, FirstProtocol,  AnotherProtocol {  /*..省略..*/ }

可以看到,除了写上遵循协议以外,还同时可以写上父类,但是这里要注意,父类必须写在协议的前面.

协议中的声明与实现的要求

属性声明与实现的要求

方法声明与实现的要求

协议也是一种类型

protocol也是一种类型(首字母大写)

既然协议是一种类型,那么,我们就可以对它进行扩展,继承,和一些运算操作

下面就针对这三点说一下,协议在做相应操作时的一些独特性质

协议在代理中的运用

骆神为了以防将来我们装X失败,多次强调这个委托回调代理是完全不同的东西,然后告诉我们iOS中大量运用的都是委托回调,很荣以弄混,并举了几个例子来给我解释,但我表示并没有弄弄明白.

我去网上寻找相关的内容有以下几点疑问:

  1. 委托回调的英文说法是否就是Call Back,不是,那我表示我到目前为止我的寻找方向就是个错误,因为中文区根本搜不到相关内容,用英文模糊搜索,才找到疑似相关内容的东东(diferent between Delegate and Call Back ),这是我检索所用的关键词,如果是的话,那我要说第二条了
  2. 洛神也提到了说代理模式是"四人帮"设计模式的一种,但我表示,我上维基百科上看了一下相关模式,并没有找到类似的模式,请知道的指条明路,主要是因为想了解这两者的区别
  3. 我根据第一条说的关键词,检索出来一些人提出的疑似与我相同疑问的问题,我看到了下面几种回答
    • A delegate is the description on how the callback function looks like
    • 如果一个method或function的调用,只有单一的callback,那么就用block,如果可能会有多个不同的callback,那么就使用delegate.这么做的好处是,当一个method或function调用时会有多种callback时,有可能某些callback是没有必要实现的
    • Generically, a delegate is an object used to access a method external to the object owning the method, while a callback is a variable that holds a delegate
    • Delegates are the idiomatic way of implementing callbacks in .NET - but you don't have to.There are plenty of uses for delegates beyond callbacks in .NET - it depends on exactly what you deem to be a callback, but GUI event handlers, thread-starters, filters and projections (and more!) in LINQ to Objects all use delegates.
    • A "callback" is a term that refers to a coding design pattern. In this pattern, you pass a pointer to a function to another function, so that within the called function, it can "call back" the function you passed to it. A Delegate, otoh, is a specific .Net type that acts as a signature-specific container for a function pointer...

晕了吧~我早就晕了,我根本搞就是脑子早就炸了...本来英语就差,结果你一嘴,我一嘴,完全搞不懂...

我再描述一下我对洛神对这个问题的描述与解释的理解吧,大家可以参考一下,明白的可以出来冒个泡,给哥们儿指条明路

场景: 学生找枪手代考

  • 委托回调的实现方法:
    1. 声明一个枪手代考的协议
    2. 在学生类里定义一个delegate属性,该属性遵循枪手代考协议,且是个可空类型,且使用weak关键词定义,以防循环调用造成的内存泄漏
    3. 在学生考试这个方法中,把delegate属性拿出来,也就是把枪手找来,让枪手执行枪手自带的代考方法
    4. 枪手类这边,要声明自己遵循了代考协议
    5. 枪手类在自己的代码里,要实现代考协议要求的代考方法
    6. 在现实中(在main函数中),把枪手赋值给学生的delegate属性,并让学生调用考试方法,学生的考试方法中自然就会激活枪手去调用枪手自己的代考方法,于是代考事件,发生了
  • 代理的实现方法:
    1. 声明一个考试协议
    2. 学生与枪手都声明,且实现了该考试协议
    3. 枪手类设置了一个target属性,该属性是学生类,
    4. 枪手在实现自己的考试协议要求的考试方法中,调用了这个target属性,并取到了学生的姓名,年龄,考号,然后开始代考

好了,委托回调和代理方法的实现都描述完毕了,请问这区别在哪?我知道这有很多缺别,请问它们本质的区别在哪?我今后怎么区分?我又应该如何运用呢?

下面也贴出我的委托回调的笔记

委托回调

有的时候某个对象做某件事但其自身又没有能力做这件事,这个时候就可以使用委托回调的编程模式让别的对象来做这件事

实现委托回调编程模式步骤:

  1. 设计一个协议(被委托方必须要遵循协议才能给别的对象当委托)
  2. 委托方添加一个属性,其类型是被委托方(抽象的)
  3. 自己做不了的事,委托给别的对象来做
  4. 让视图控制器遵循协议,称为被委托方(协议表能力)
  5. 遵循协议要实现协议中的方法(协议表约定)
  6. 给画布对象绑定委托
委托回调Tips

在定义协议的时候可以通过如下方法,限制该协议只允许类调用(或结构体,枚举都可以)

protocol CanvasDelegate: class {
  //...省略...
}

同时,如果限制只能类调用的话,那么在第二步,委托方添加属性的时候,需要在前面添加关键词weak,是为了防止委托方与被委托方形成闭环后导致内存无法释放的情况,所以一般都会在前面加上关键词weak

我再说一点,我在这个过程中了解到的东西,就是为什么要用协议,而不用继承,

继承为类型引入的是静态特质,也就是说继承而来的功能都是在编译的时候获取的

而协议则不同,声明协议的时候并没有实现,而是谁调用谁实现,是一种动态的往一个类中添加新的行为的方式,这样的方式比生成子类更为灵活

其实这里我也有个疑问:

灵活在哪? 是因为编译的时候就生成一堆子类会占用很多空间吗?

上一篇下一篇

猜你喜欢

热点阅读