您的位置:首页 > 移动开发 > Swift

Swift 委托/代理设计模式

2015-08-29 15:06 316 查看
Swift 中的委托/代理模式(以下简称"代理模式")与object-c的代理模式基本一致。

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

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

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

我们通过实例来实现:

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

protocol RentProtocol{
    //协议内容
    
    //有一个找房子的要求
    func Renting()
}


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

class MaYaHouse: RentProtocol {
    func Renting() {
        println("我是玛雅房屋,我可以找房子")
    }
}


class ZhangSan: RentProtocol {
    func Renting() {
        println("我是张三,我可以找房子")
    }
}


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

class MyHouse{
    
    var rentDelegate:RentProtocol?
    
}


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

var maya=MaYaHouse()
        var zhangsan=ZhangSan()


var maya=MaYaHouse()
        var zhangsan=ZhangSan()

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


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

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

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

class Lisi {
    func Renting(){
        
        println("我是李四,我可以找房子")
    }
}


var lisi=Lisi()
        
        var myHouse=MyHouse()
        myHouse.rentDelegate=lisi
        myHouse.rentDelegate?.Renting()


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

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

好了 ,有问题欢迎交流

苹果开发群 :414319235 欢迎加入 欢迎讨论问题
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: