【问题标题】:Can a 'delegate' property support multiple protocols?“委托”属性可以支持多种协议吗?
【发布时间】:2012-05-11 10:07:20
【问题描述】:

我可以找到很多关于使对象支持多种协议的问题,但没有人确认 @property 是否可以。例如,我有一个具有以下属性的类:

@property (strong) id dataSource;

这里传入的对象支持 UITableViewDataSource 协议,因此我可以毫无问题地分配它,在 ARC 中没有警告:

self.tableView.dataSource = self.dataSource;

我还想实现另一个协议,比如搜索,名为 CustomControllerSearchDelegate。但是,如果我开始随机调用其他方法,ARC 就会开始抱怨。所以我们沿着协议路在我的对象中定义它并让属性支持它。这会导致分配给表数据源的问题。所以对于主要问题,我可以这样做:

@property (strong) id <UITableViewDataSource, CustomControllerSearchDelegate> dataSource;

如果不是,什么是合适的选择?

或者,什么是正确的方法来消除这个编译器警告:

Assigning to 'id<UITableViewDataSource>' from incompatible type
'id<PickerViewControllerDataSource>'

抱歉,如果这解释得不好。 :/

-- 编辑--

所以我的协议现在定义为:

@protocol PickerViewControllerDataSource <UITableViewDataSource>

属性定义为:

@property (strong) id <PickerViewControllerDataSource> dataSource;

但编译器会抛出以下错误:

No known instance method for selector 'objectAtIndexPath:'

-- 编辑--

在自定义协议中声明。现在声明如下:

@protocol PickerViewControllerDataSource <UITableViewDataSource>

- (id)objectAtIndexPath:(NSIndexPath *)indexPath;

@optional

- (void)searchDataWithString:(NSString*)string;
- (void)cancelSearch;

@end

谢谢。

【问题讨论】:

    标签: objective-c properties delegates protocols


    【解决方案1】:

    您可以创建一个包含其他协议的协议,例如:

    @protocol MyDataSourceProtocol <UITableViewDataSource, CustomControllerSearchDelegate>
    @end
    

    来自Objective-C Programming Guide

    一个协议可以使用相同的语法合并其他协议 用于采用协议的类:

    @protocol ProtocolName

    您的dataSource 属性将被定义为:

    @property (strong) id <MyDataSourceProtocol> dataSource;
    

    或者您的CustomControllerSearchDelegate 协议可以合并UITableViewDataSource 协议:

    @protocol CustomControllerSearchDelegate <UITableViewDataSource>
      ... new methods here ...
    @end
    

    在这种情况下,您的 dataSource 属性将被定义为:

    @property (strong) id <CustomControllerSearchDelegate> dataSource;
    

    我个人更喜欢后一种方法。

    【讨论】:

    • 嗯我不知道,从来没有真正理解协议声明中默认 的重要性。如果我做你的第一个建议,我会得到一个编译器错误。 更新的问题顺便说一句,我有点 AFK。
    • @Diziet UITableViewDataSource 协议中没有选择器 objectAtIndexPath,所以这是有道理的。
    • 谢谢,你已经完美地回答了我的问题,协议声明本身可以继承,因此 部分具有我以前没有意识到的意义。
    猜你喜欢
    • 2017-05-10
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多