合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下
1、单向代理:
拿今天ZG给我讲的故事开始说起吧,小新晚上一个人在家里,外边总是有异响,他被吓的睡不着,就想让他的狗狗们去门口吼两声,壮壮胆。
//小新说:谁帮我去吼两声
//此时小新就是委托人,他说出了自己的需求,
//也就是协议
protocol GoToBarkDelegate{
func bark()
}
//这事自然就要狗来完成了,狗能完成他的需求,
//可以代理就遵守此协议去完成事情
//此时狗狗就是代理,遵守其协议
class Dog: GoToBarkDelegate {
func bark() {
print("汪汪汪")
}
}
class Person {
////找代理
var delegate:GoToBarkDelegate?
//告诉代理他需要完成的任务
func helpMeToBark() {
self.delegate?.bark()
}
}
//xiaohei站出来说我去,径直的走出去大吼起来
let xiaohei = Dog()
//此时xiaoxin就是委托人
let xiaoxin = Person()
//xiaohei是xiaoxin 的代理
xiaoxin.delegate = ixiaohei
//xiaoxin说帮我去叫
xiaoxin.helpMeToBark()
好吧,我这讲故事的能力也就这样了,还是通过技术层面深度剖析这个问题吧。
protocol GoToBarkDelegate{
func bark()
}
class Dog: GoToBarkDelegate {
func bark() {
print("汪汪汪")
}
}
class Person {
var delegate:GoToBarkDelegate?
func helpMeToBark() {
self.delegate?.bark()
}
}
let xiaohei = Dog()
let xiaoxin = Person()
xiaoxin.delegate = ixiaohei
xiaoxin.helpMeToBark()
这是整个代码,拿C++语言的角度来理解一下吧,GoToBarkDelegate协议其实本质就类似于C++的纯虚类,类Dog 继承于它,继承并实现它的bark()方法;
Person类中的第一个delegate属性其实就是GoToBarkDelegate的一个对象通过函数helpMeToBark()实现在Person类中调到Dog中的bark()函数,相当于:
let dog = Dog.init()
let delegate:GoToBarkDelegate = dog其实此处还包含多态,经典的拿子类对象去实例化父类对象,即编译时类型和运行时类型不一致。调到的是子类Dog重写父类GoToBarkDelegate的bark()函数
其实整体就是这样一个流程。
总结:
1、代理方类继承协议(纯虚类)
2、委托方中含有一个纯虚类对象(多态的发生)