iOS 协议代理的继承和扩展

来源:互联网 发布:仓库卷帘自动门plc编程 编辑:程序博客网 时间:2024/05/16 17:50

         在编码时,为了部分代码复用,可能会用带继承关系,有时,父类的协议代理有限,需要我们在继承的同时,扩展父类的协议方法。此时,存在两种选择:

1、在父类协议代理delegate的基础上扩展新方法。

如UIKit框架中,UITableView 继承自UISCrollView ,同时他们都有同名的Delegate 属性,UITableView的Delegate是在UISCrollView的基础上扩展的

举个例子,我有一个类WYKTextField,继承自类UITextField,UITextField有一个代理 delegate,而我自己的类XMTextField也有自己的代理delegate。

实现方式:

@roperty (nonatomic, weak)id <WYKTextFeildDelegate> delegate;

现在xcode提示两个警告

1、 propert type XMTextFieldDelegate is incompatible with type UITextFieldDelegate inherited from UITextField。

2、 Auto property synthesis will not synthesize property 'delegate'; it will be implemented by its superclass,use @dynamic to...

解决第一警告------子类协议遵循父类的协议(iOS 中的协议可以是多继承关系

@protocol XMTextFieldDelegate<NSObject,UITextFieldDelegate>@end

解决第二个警告------用@dynamic

@implementation XMTextField@dynamic delegate;@end

总结:

  1. 第一个就是遵循父类的代理方法。
  2. 第二个就是用@dynamic告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。(按代理的使用的正常步骤设置,无需专门写setter与getter方法

2、在子类中创建一个不同与父类的新的协议代理属性。

如UIKit框架中,UITableView 继承自UISCrollView,UITableView 子类拥有DataSource 协议代理属性,和 delegate 独立使用。

在子类中 仿照父类的情况,定义一套协议代理方法,注意新的协议代理属性不同于父类的delegate 即可,如dataSource,使用时方式相似,这里不再赘述。

对代理的深入学习,请阅读:
iOS 协议代理的深入理解
iOS 关于修饰代理用weak还是assign, strong

作者水平有限,如有不足之处,欢迎交流学习!
1 0
原创粉丝点击