类型id <protocol1>不符合id <protocol2> - 但确实如此!</protocol2> </protocol1>

时间:2009-08-20 22:25:28

标签: objective-c delegates protocols

好吧,我在同一个头文件中有两个协议,让我们称它们为Protocol1和Protocol2。我有一个符合这两个协议的主app控制器,以及一个具有以下成员的NSWindowController子类:

id <Protocol1, Protocol2> delegate;

我在我的NSWindowController子类实现结束时收到警告“类型id不符合Protocol2”。但是,如图所示,委托必须符合这两种协议。

此外,该应用程序运行良好。还有其他方法可以做到这一点吗?我想我可以将两个协议一起折叠,但这会损害程序的模块性。

修改

以下是两种协议。由于这更像是一个测试场景,因此它们很短。

@protocol TPTBController <NSObject>

-(void)sendGrowlMessage:(NSString *)message title:(NSString *)title;

@end

@protocol AddPower <NSObject>

-(void)addPower:(NSArray *)array;
-(void)setCanAddPower:(BOOL)can;

@end

3 个答案:

答案 0 :(得分:3)

如果id-with-protocols实际上支持协议列表,则语言规范不明确。协议可以扩展协议列表,但不清楚该语法是否支持它。

您可以创建组合协议:

@protocol AddPowerAndTPTBController <AddPower, TPTBController>
@end
...
id <AddPowerAndTPTBController> delegate;

虽然不优雅,但它会起作用;但是它也需要你的委托类符合AddPoewrAndTPTBController,而不仅仅是两个单独的。

答案 1 :(得分:0)

您是否在NSWindowController子类上导入协议?

应用程序的工作指向了我的方向。似乎在进行静态检查时,编译器无法确定您的类是否符合协议,而实际调度消息时它正在成功(这就是应用程序按预期工作的原因)

答案 2 :(得分:0)

如果将协议拆分为单独的文件,然后将它们导入NSWindowController类,会发生什么?