您的位置:首页 > 移动开发 > IOS开发

iOS 协议代理的继承和扩展

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

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

总结:

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

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

如UIKit框架中,UITableView 继承自UISCrollView,UITableView 子类拥有DataSource 协议代理属性,和 delegate 独立使用。
在子类中 仿照父类的情况,定义一套协议代理方法,注意新的协议代理属性不同于父类的delegate 即可,如dataSource,使用时方式相似,这里不再赘述。

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

作者水平有限,如有不足之处,欢迎交流学习!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: