Objective c 类型id<;协议1>;不符合id<;协议2>;——但确实如此!

Objective c 类型id<;协议1>;不符合id<;协议2>;——但确实如此!,objective-c,delegates,protocols,Objective C,Delegates,Protocols,好的,我在同一个头文件中有两个协议,我们称它们为Protocol1和Protocol2。我有一个符合这两个协议的主应用程序控制器和一个NSWindowController子类,该子类具有以下成员: id <Protocol1, Protocol2> delegate; id代表; 在NSWindowController子类实现的末尾,我收到一条警告:“类型id不符合Protocol2”。但是,如图所示,委托必须遵守这两个协议,它确实如此 此外,该应用程序运行良好。还有别的办法吗?

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

id <Protocol1, Protocol2> delegate;
id代表;
在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
@protocol-TPTBController
-(void)sendGrowlMessage:(NSString*)消息标题:(NSString*)标题;
@结束
@协议附加功率
-(void)addPower:(NSArray*)数组;
-(无效)setCanAddPower:(BOOL)can;
@结束

是否在
NSWindowController
子类上导入协议


该应用程序的运行为我指明了方向。似乎在执行静态检查时,编译器无法判断您的类是否符合协议,而在实际分派消息时,它正在成功(这就是应用程序按预期工作的原因)

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

语言规范不清楚带有协议的id是否支持协议列表。协议可以扩展协议列表,但不清楚语法是否支持它

您可以创建一个组合协议:

@protocol AddPowerAndTPTBController <AddPower, TPTBController>
@end
...
id <AddPowerAndTPTBController> delegate;
@protocol AddPowerAndTPTBController
@结束
...
id代表;

虽然不优雅,但它会起作用;但是它也需要您的委托类遵守AddPoewrAndTPTBController,而不仅仅是这两个单独的协议。

是的,我已经在子类的头文件中导入了协议。对我来说,这似乎特别奇怪,因为它只抱怨其中一个协议可能不符合。好像它忽略了代理的声明。请显示两个协议声明好吗?当然,检查我编辑的问题。他们在同一个文件里,这起作用了。我还找到了另一种方法,将委托作为一个属性,并以这种方式为id指定所采用的协议。