好吧,我在同一个头文件中有两个协议,让我们称它们为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
答案 0 :(得分:3)
如果id-with-protocols实际上支持协议列表,则语言规范不明确。协议可以扩展协议列表,但不清楚该语法是否支持它。
您可以创建组合协议:
@protocol AddPowerAndTPTBController <AddPower, TPTBController>
@end
...
id <AddPowerAndTPTBController> delegate;
虽然不优雅,但它会起作用;但是它也需要你的委托类符合AddPoewrAndTPTBController,而不仅仅是两个单独的。
答案 1 :(得分:0)
您是否在NSWindowController
子类上导入协议?
应用程序的工作指向了我的方向。似乎在进行静态检查时,编译器无法确定您的类是否符合协议,而实际调度消息时它正在成功(这就是应用程序按预期工作的原因)
答案 2 :(得分:0)
如果将协议拆分为单独的文件,然后将它们导入NSWindowController
类,会发生什么?