代码之家  ›  专栏  ›  技术社区  ›  Cinder6

类型id<Protocol1>不符合id<Protocol2>-但它符合!

  •  3
  • Cinder6  · 技术社区  · 16 年前

    好的,我在同一个头文件中有两个协议,我们称它们为Protocol1和Protocol2。我有一个符合这两个协议的主应用程序控制器和一个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 回复  |  直到 16 年前
        1
  •  3
  •   AlBlue RACGAMERUP    16 年前

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

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

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

        2
  •  1
  •   pgb    16 年前

    您是否正在导入服务器上的协议 NSWindowController 子类?

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

        3
  •  0
  •   Tim    16 年前

    如果将协议分解成单独的文件,然后将它们都导入到您的 NSWindowController