Delegate 原理浅析
B 的一个方法运行到某处,需要把自己的一个值告诉 A,并且做一定处理
怎么来实现呢?
首先 B 要知道自己去告诉谁,然后再调用 A.aFunc()
我知道想知道原理的不想看代码,尽量简化了
A, B 类
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 
 | A.swiftclass A {
 func aFunc(b:B) {
 println(b.value)
 }
 }
 
 B.swift
 class B {
 var value = 0
 func bFunc () {
 value = 213
 a.aFunc(b)
 }
 }
 
 | 
上面是不行的,为啥呢?
因为 b 里面并没有 a,如果直接把 A 传进去,就要修改 B 的代码,也就丢失了封装
我们看下 Delegate 怎么实现这种机制的
Delegate
既然是 B 要往外发送消息,就先从 B 下手:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 
 | A.swiftclass A {
 func aFunc(b:B) {
 println(b.value)
 }
 }
 
 b.swift
 protocol BDelegate {
 func aFunc(b:B)
 }
 
 class B {
 var delegate:BDelegate?
 var value = 0
 func bFunc () {
 value = 213
 delegate?.aFunc(self)
 }
 }
 
 | 
做了 1、2、3 后,还是不行,为啥呢?
因为 A 不知道 B 进行了委托,两者没关联起来
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 | a.swiftclass A: BDelegate {
 func aFunc(b:B) {
 b.delegate = self
 println(b.value)
 }
 }
 
 b.swift
 protocol BDelegate {
 func aFunc(b:B)
 }
 
 class B {
 var delegate:BDelegate?
 var value = 0
 
 func bFunc () {
 value = 213
 delegate?.aFunc(self)
 }
 }
 
 main.swift
 let b = B()
 let a = A()
 a.aFunc(b)
 b.bFunc()
 
 
 
 | 
大功告成
回想下常见的代码,比如:
| 12
 3
 4
 5
 
 | mScrollView.delegate = self...
 class MYScrollView : UIScrollView, UIScrollViewDelegate {
 ...
 func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
 
 | 
是不是有种豁然开朗的感觉?
过两天说说 SEL 和 Block
感觉还是木说清楚呢,有不清楚的地方,欢迎留言探讨哈~~~