我有一个类作为转发委托的通用代理。通过实现respondsToSelector
和forwardInvocation
,我可以使用此类转发将被发送给各种UI控件的委托的选择器。
问题是,当我使用这个类时,我得到一个编译器警告。例如,如果我使用它将消息转发到UITableViewDelegate:
DelegateForwarder* _forward = [[DelegateForwarder alloc] init];
_tableView.delegate = _forward;
我收到编译器警告:
Assigning to id<UITableViewDelegate> from incompatible type 'DelegateForwarder'
我知道警告是生成的,因为DelegateForwarder不采用UITableViewDelegate
委托,但我不希望它 - 因为它提供的转发机制完全是通用的。
尽管警告我的代码按预期运行。
我能做些什么来以某种方式向编译器和该类用户表明它使用消息转发,因此它不采用特定协议的事实不是问题吗?
答案 0 :(得分:3)
扩展评论......
由于id
被称为“通用对象类型”,因此使用它是类型检查机制的一个信号,即被引用对象的性质被认为是完全动态的。这意味着代码如......
DelegateForwarder* _forward = [[DelegateForwarder alloc] init];
_tableView.delegate = _forward;
...意味着应检查DelegateForwarder
变量的一致性,而......
id _forward = [[DelegateForwarder alloc] init];
_tableView.delegate = _forward;
...是一种“信任我”的宣言。
答案 1 :(得分:0)
检查是否已将<UITableViewDelegate>
添加到DelegateForwarder
协议列表中。一般来说,这比使用通用“id”类型初始化更合适。