Swift基础之代理与传值(一)

合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下

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、委托方中含有一个纯虚类对象(多态的发生)

注:以上为了方便大家理解概念,举得例子都是从现实生活的角度出发的,只是为了让大家将重点关注在其原理上。在实际程序开发中的协议代理和实际生活中的协议代理思想 表面上看起来像是正好相反的。这个会在以后的博客中持续为大家介绍,谢谢大家。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值