0

我有一个类,它充当转发代表的通用代理。通过实现respondsToSelectorforwardInvocation我可以使用这个类来转发选择器,这些选择器将被发送给各种 UI 控件的委托。

问题是当我使用这个类时,我得到一个编译器警告。例如,如果我使用它将消息转发到 UITableViewDelegate:

DelegateForwarder* _forward = [[DelegateForwarder alloc] init];
_tableView.delegate = _forward;

我收到编译器警告:

Assigning to id<UITableViewDelegate> from incompatible type 'DelegateForwarder'

我知道生成警告是因为 DelegateForwarder 不采用UITableViewDelegate委托,但我不希望它这样做 - 因为它提供的转发机制是完全通用的。

尽管有警告,但我的代码按预期运行。

我可以做些什么来以某种方式向此类的编译器和用户表明它使用消息转发,因此它不采用特定协议的事实不是问题吗?

4

2 回答 2

3

扩展评论....

由于id被称为“通用对象类型”,它的使用是向类型检查机制发出的信号,即被引用对象的性质被认为是完全动态的。这意味着诸如...的代码

DelegateForwarder* _forward = [[DelegateForwarder alloc] init];
_tableView.delegate = _forward;

...意味着DelegateForwarder应该检查变量的一致性,而...

id _forward = [[DelegateForwarder alloc] init];
_tableView.delegate = _forward;

...是一种“相信我”的声明。

于 2012-11-13T15:46:36.490 回答
0

检查您是否添加<UITableViewDelegate>DelegateForwarder的协议列表中。一般来说,它比使用通用“id”类型初始化更合适。

于 2012-11-13T15:51:33.140 回答