1.委托说明:如果一个类想知道另外一个类发生的事件并且做出反应,比起使用类的继承,使用委托机制更能减少代码的复杂度。
2.委托的实现:假如有两个类,一个是房子,一个是看门狗,房子里有钱。
class WatchDog{
}
class House{
var money:Float = 100
}
需要实现的是狗发现屋子里的钱变少了就要叫让主人知道,实现方法是先创建一个协议其中有抽象的狗吠函数,再在房子里创建一个看门狗的实例,然后让看门狗实现该协议。
protocol dogScream{
func scream()
}
class House{
var delegate:dogScream //注意这里委托的类型是协议
var money:Float = 100{
didSet{
delegate.scream()
}
}
init(..., delegate:dogScream){ //类初始化函数
self.delegate=delegate
}
}
class WatchDog:dogScream{
func scream(){
//....//
}
}
3.这样在钱改变了数值后就会触发看门狗吠。
实现中我觉得最奇怪的地方就是:House中delegate声明为协议类型,但是实例对象的类型是实现了该协议的类,把delegate声明为类类型不行吗?但是想了想,protocol不能单独使用不能实例化必须有东西来实现它才能使用。所以delegate声明为protocol类型实际上是实现了这个protocol的类类型。这样delegate就能是不同的类有不同的协议实现方式,就有不同的反应。比如有另外一只狗,它发现钱少了的反应就可以不是叫而是咬人(将scream函数实现成咬人).