2

我可以找到很多关于使对象支持多种协议的问题,但没有人确认 @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

谢谢你。

4

1 回答 1

5

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

@protocol MyDataSourceProtocol <UITableViewDataSource, CustomControllerSearchDelegate>
@end

来自Objective-C 编程指南

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

@protocol ProtocolName <协议列表>

您的dataSource财产将被定义为:

@property (strong) id <MyDataSourceProtocol> dataSource;

或者,您的CustomControllerSearchDelegate协议可以包含以下UITableViewDataSource协议:

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

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

@property (strong) id <CustomControllerSearchDelegate> dataSource;

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

于 2012-05-11T10:19:07.547 回答