Swift 中的委托/代理模式(转载)

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

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

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

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


我们通过实例来实现:

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

[objc]  view plain copy
  1. protocol RentProtocol{  
  2.     //协议内容  
  3.       
  4.     //有一个找房子的要求  
  5.     func Renting()  
  6. }  
然后我们在定义一个玛雅房屋,一个张三,让他们都实现这个协议

[objc]  view plain copy
  1. class MaYaHouse: RentProtocol {  
  2.     func Renting() {  
  3.         println("我是玛雅房屋,我可以找房子")  
  4.     }  
  5. }  

[objc]  view plain copy
  1. class ZhangSan: RentProtocol {  
  2.     func Renting() {  
  3.         println("我是张三,我可以找房子")  
  4.     }  
  5. }  
然后我们再定义一个我的类,我有一个属性,rentDelegate 他需要有找房子的能力,然后我要委托他找房子 Renting()

[objc]  view plain copy
  1. class MyHouse{  
  2.       
  3.     var rentDelegate:RentProtocol?  
  4.       
  5. }  
然后我们新建一个MyHouse 的对象,然后给他赋值玛雅房屋的对象试试看能找房子不


[objc]  view plain copy
  1. var maya=MaYaHouse()  
  2. var zhangsan=ZhangSan()  


[objc]  view plain copy
  1. var maya=MaYaHouse()  
  2. var zhangsan=ZhangSan()  
  3.   
  4. var myHouse=MyHouse()  
  5. myHouse.rentDelegate=maya //我们会发现不管这里赋值是maya,还是 zhangsan 我们要找房子的时候都是调用下面一行方法,和这里赋值无关  
  6. myHouse.rentDelegate?.Renting()  
我们发现不管我们吧maya 还是zhangsan赋值给 myHouse(也即是我们委托给maya或者zhangsan) 我们都可以调用rentDelegate.Renting 来实现找房子

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


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

[objc]  view plain copy
  1. class Lisi {  
  2.     func Renting(){  
  3.           
  4.         println("我是李四,我可以找房子")  
  5.     }  
  6. }  

[objc]  view plain copy
  1. var lisi=Lisi()  
  2.   
  3. var myHouse=MyHouse()  
  4. myHouse.rentDelegate=lisi  
  5. myHouse.rentDelegate?.Renting()  
我们会发现编译不通过,lisi不是我们所需要类型


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

综上:代理似java里的接口,但又不是接口
对象只管使用代理类中得方法,而不用管去实现,由其他类去实现这个协议,对象只管调用方法。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值