conformsToProtocol不起作用

时间:2013-06-12 08:14:46

标签: objective-c

嗨,我有一个协议的问题

  #import <Foundation/Foundation.h>

  @protocol StandardQuality <NSObject>

  - (NSString *)color;
  - (NSString *)fabric;
  -( NSString *)store;
  - ( NSString *)price;

  @end

我在类

中实现此协议
  @interface Hat : NSObject <StandardQuality> 

  @property NSString *color;
  @property NSString *fabric;
  @property NSString *store;

  @end

这是我所期望的。我收到了一条警告信息

协议未实现的

方法“价格”。

无论如何。我在main.h中测试了

    [myHat setShop:@"Unirea"];
    NSLog(@" The  hat is selling at %@", myHat.store);

    if([myHat conformsToProtocol:@protocol(StandardQuality)]== YES)
    {
        NSLog(@"My hat respects the protocol");
    }
    else {
         NSLog(@"My hat doesn't respect the protocol");

    }


    if([myHat respondsToSelector:@selector(price)]== YES)
    {
        NSLog(@"My hat has price");
    }
    else {
        NSLog(@"My hat doesn't have price");

    }

奇怪的是,我收到了

我的帽子尊重协议

我的帽子没有价格

我的第二个问题是:如果不遵守协议,这是阻止编译器编译程序的方法,而不仅仅是接收警告消息?

4 个答案:

答案 0 :(得分:2)

  

奇怪的是,我收到了

     

我的帽子尊重协议

     

我的帽子没有价格

有什么奇怪的?你完全得到了你所做的。您的类符合协议,但未实现price方法。

  

如果不遵守协议,这是阻止编译器编译程序的方法,而不仅仅是接收警告消息?

我想你想问一下是否有办法。好吧,你可以打开-Werr编译器开关,如果遇到警告就会使编译器挽救,然后可能只关闭协议中未实现的方法的警告(谷歌搜索相应的编译器标志)。

答案 1 :(得分:2)

您可以通过将-Werror=incomplete-implementation添加到Xcode项目“Build Settings”的“Language”部分中的“Other C Flags”,将不完整协议的警告转换为错误(或者您可以传递该选项)如果从命令行调用,则为编译器。)

如果您想在运行时检查某个类是否实际实现了协议,而不是简单地声明该协议,请参阅addendum to this answer

答案 2 :(得分:1)

来自API docs

  

此方法仅在正式的基础上确定一致性   头文件中的声明,如上所示。它没有检查   查看协议中声明的方法是否实际   实施 - 这是程序员的责任。

答案 3 :(得分:1)

documentation你的班级符合协议,因为你在@interface

中宣布它是这样的
@interface Hat : NSObject <StandardQuality>

但是,您尚未实施price方法。

@required@optional协议方法的概念。如果你绝对需要一个类来实现协议的全部或部分方法,你应该像这样指定它:

@protocol StandardQuality <NSObject>

@required
- (NSString *)color;
- (NSString *)fabric;
- (NSString *)store;

@optional
- (NSString *)price;

@end

在这种情况下,您应该检查实现协议的对象是否实际实现了可选方法而不调用它们。

我认为你正在寻找的更多。