0

嗨,我对一个协议有疑问

  #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

4 回答 4

2

奇怪的是,我收到了

我的帽子尊重协议

我的帽子没有价格

有什么奇怪的?你会得到你所做的一切。您的类符合协议,但不实现该price方法。

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

我想你想问是否有办法。好吧,您可以打开-Werr编译器开关,如果遇到警告,编译器就会退出,然后可能只关闭协议中未实现方法的警告(谷歌寻找适当的编译器标志)。

于 2013-06-12T08:20:15.660 回答
2

您可以通过添加到 Xcode 项目“构建设置”的“语言”部分中的“其他 C 标志”将不完整协议的警告转换为错误-Werror=incomplete-implementation(或者如果从命令调用,您可以将该选项传递给编译器线)。

如果您想在运行时检查一个类是否真正实现了协议,而不是简单地声明它确实实现了,请参阅此答案的附录

于 2013-06-12T09:27:42.840 回答
1

文档中,您的类符合协议,因为您在它的@interface

@interface Hat : NSObject <StandardQuality>

但是,您还没有实现该price方法。

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

@protocol StandardQuality <NSObject>

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

@optional
- (NSString *)price;

@end

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

我认为更多的是您正在寻找的东西。

于 2013-06-12T09:39:28.233 回答
1

API 文档

此方法仅根据头文件中的正式声明来确定一致性,如上所示。它不检查协议中声明的方法是否实际实现——这是程序员的责任。

于 2013-06-12T09:35:55.567 回答