Swift 中的委托/代理模式(以下简称"代理模式")与object-c的代理模式基本一致。

代理模式的基本思想就是将我(类或者结构体等)需要来完成的工作交给(委托给)另一个有我所规定的做这项工作能力的人(符合要求类型的对象等)来处理。

代理模式的实现需借助于我们上一篇文章所讲的协议。我们定义一个协议来封装那些指定的方法(做这项工作的能力),使实现这些协议的类等拥有这些方法,我们就可以将工作委托给他来处理。

举个实际例子,比如我要去租房,首先我是有租房的能力,但是我没有时间或者其他原因去做这件事,这个时候我就得找一个有租房能力的人或者机构去帮我 租房。比如说我找到了玛雅房屋让他们去帮我租租房。我只需要告诉他们我要一个大致什么位置,多大,什么类型,价格范围等,他们就可以帮我去租房。在这个例 子中 我就是一个要委托的类,我委托的对象有一些要求(也就是定义中所说的做这项工作的能力):能按照要求找房子。玛雅房屋就是接受委托的对象,因为他有满足我 要求的能力。如果说张三也有我所要求的找房子的能力,那么张三也可以作为我找房子的委托对象,至于我委托给谁都可以,只要他满足找房子的能力。

我们通过实例来实现:

首先我得定义协议,来写明我的要求有找房子的能力

  1. protocol RentProtocol{
  2. //协议内容
  3. //有一个找房子的要求
  4. func Renting()
  5. }

然后我们在定义一个玛雅房屋,一个张三,让他们都实现这个协议

  1. class MaYaHouse: RentProtocol {
  2. func Renting() {
  3. println("我是玛雅房屋,我可以找房子")
  4. }
  5. }
  1. class ZhangSan: RentProtocol {
  2. func Renting() {
  3. println("我是张三,我可以找房子")
  4. }
  5. }

然后我们再定义一个我的类,我有一个属性,rentDelegate 他需要有找房子的能力,然后我要委托他找房子 Renting()

  1. class MyHouse{
  2. var rentDelegate:RentProtocol?
  3. }

然后我们新建一个MyHouse 的对象,然后给他赋值玛雅房屋的对象试试看能找房子不

  1. var maya=MaYaHouse()
  2. var zhangsan=ZhangSan()
  1. var maya=MaYaHouse()
  2. var zhangsan=ZhangSan()
  3. var myHouse=MyHouse()
  4. myHouse.rentDelegate=maya //我们会发现不管这里赋值是maya,还是 zhangsan 我们要找房子的时候都是调用下面一行方法,和这里赋值无关
  5. myHouse.rentDelegate?.Renting()

我们发现不管我们吧maya 还是zhangsan赋值给 myHouse(也即是我们委托给maya或者zhangsan) 我们都可以调用rentDelegate.Renting 来实现找房子

所以我们发现不管我们委托给谁,只要他有这个找房子的能力,而不需要管他们是用什么方式找房子的(也就是他们有实现代理规定的renging()方法就行,具体方法实现的功能我们不需要管)

我们试一下将一个自己有找房子功能 而没有按照我们的要求,也就是没有实现协议的 赋值给 rentDelegate 试一试

  1. class Lisi {
  2. func Renting(){
  3. println("我是李四,我可以找房子")
  4. }
  5. }
  1. var lisi=Lisi()
  2. var myHouse=MyHouse()
  3. myHouse.rentDelegate=lisi
  4. myHouse.rentDelegate?.Renting()

我们会发现编译不通过,lisi不是我们所需要类型

所以说委托对象一定要实现我们的规定协议才可以

Swift 委托/代理设计模式的更多相关文章

  1. IOS之Objective-C学习 代理设计模式

    鉴于Objective-C是不支持多继承的,所以需要用协议来代替实现其他类的方法,所以有了代理设计模式. 代理,又称委托,delegation. 代理模式可以让一个单继承的类实现父类以外其他类的方法. ...

  2. 你真的了解iOS代理设计模式吗?

    在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递一些参数.这篇文章会涵盖代理的使用技巧和原理,以及代理的内存管理等方面的知识.我会通过这些方面的知识,带大 ...

  3. 【转】你真的了解iOS代理设计模式吗?

    转自:http://www.cocoachina.com/ios/20160317/15696.html 在项目中我们经常会用到代理的设计模式,这是iOS中一种消息传递的方式,也可以通过这种方式来传递 ...

  4. OC学习——OC中的@protocol(@required、@optional)、代理设计模式

    一.什么是协议? 1.协议声明了可以被任何类实现的方法   2.协议不是类,它是定义了一个其他对象可以实现的接口   3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议.   4.协 ...

  5. Spring(八)-- 代理设计模式

    代理设计模式 1:基本概念 2:JDK动态代理 1. 创建接口 2. 创建实现类 3. 创建代理类 /** * jdk动态代理 不能满足 继承父类的情况 * * AnimalProxy 代理类 */ ...

  6. C#基础系列——委托和设计模式(二)

    前言:前篇 C#基础系列——委托实现简单设计模式 简单介绍了下委托的定义及简单用法.这篇打算从设计模式的角度去解析下委托的使用.我们知道使用委托可以实现对象行为(方法)的动态绑定,从而提高设计的灵活性 ...

  7. Objective-C之代理设计模式小实例

    *:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...

  8. ios代理设计模式

    代理设计模式的作用:     1.A对象监听B对象的一些行为,A成为B的代理     2.B对象想告诉A对象一些事情,A成为B的代理   代理设计模式的总结:     如果你想监听别人的一些行为,那么 ...

  9. Swift中的设计模式

    设计模式(Design Pattern)是 对软件设计中普遍存在的各种问题,所提出的解决方案.这个术语是由埃里希·伽玛等人(Erich Gamma,Richard Helm,Ralph Johnson ...

随机推荐

  1. struts2摘记

    阐述struts2的执行流程. Struts 2框架本身大致可以分为3个部分:核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件.核心控制器FilterDi ...

  2. Matlab.NET混编技巧之——找出Matlab内置函数

    原文 http://www.cnblogs.com/asxinyu/p/3295309.html Matlab与.NET的混合编程,掌握了基本过程,加上一定的开发经验和算法基础,肯 定不难.反之,有时 ...

  3. perl /m修饰符使用说明

    高级用法: 多行匹配: grok正则和普通正则一样, 默认是不支持匹配回车换行的. perl的/m选项 The /m modifier allows ^ and $ to match immediat ...

  4. poj1477---搭积木

    #include<stdio.h> #include<stdlib.h> int main() { int n,i; int bricks[55],set=0; while(s ...

  5. 杭电oj1062 Text Reverse

    Tips:使用一个临时数组c[1000] ,将输入的数据一边复制一边处理,碰到空格时就将前面的字符反向输出即可 #include<stdio.h> #include<string.h ...

  6. aix5.1 5.2 5.3 6.1 7.1运维技术总结

    ++++++++++++++++++++++++++++ + Ruiy 20014-10 zz + +Technology Area; + Tel:150 55198367 + QQ:5160 591 ...

  7. HTML字符实体(Character Entities),转义字符串(Escape Sequence)【转】

    为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...

  8. C#复制数据库,将数据库数据转到还有一个数据库

    本文章以一个表为例,要转多个表则可将DataSet关联多个表.以下给出完整代码.包含引用以及main函数与复制函数. 要说明的是,必须先用Sql语句复制表结构,才干顺利的使用下面代码复制数据. usi ...

  9. poj 1064 Cable master ,二分 精度!!!

    给出n根绳子,求把它们分割成K条等长的绳子的最大长度是多少? 二分 用 for(int i=0; i<100; ++i) 取代   while(r-l>eps) 循环100次精度能达到1e ...

  10. Spire PDF for .NET 在ASP.NET中的使用 ---- 并非那么“美好”,有些挫折!

    笔者注:看此文前,请您先看一下上一篇文章吧. 昨天的时候,我测试了一下Spire PDF在WinForm程序中的应用,可以说用起来很简单(请忽略效率问题,没有进行测试).不过在互联网如此发达的今天,适 ...