【问题标题】:conformsToProtocol doesn't work符合ToProtocol 不起作用
【发布时间】:2013-06-12 08:14:45
【问题描述】:

您好,我的一个协议有问题

  #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

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

协议中的方法“价格”未实现。

Anyway.I 在 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");

    }

奇怪的是,我收到了

我的帽子尊重协议

我的帽子没有价格

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

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    奇怪的是,我收到了

    我的帽子尊重协议

    我的帽子没有价格

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

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

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

    【讨论】:

    • 我认为如果一个类符合协议必须实现所有协议的方法。
    • @JohnJohnny 没有。(嗯,它应该,,但这并不意味着如果它不这样做,那么编译器将不会生成有关协议一致性的信息进入课堂。)
    • 是一种测试类协议一致性的方法吗?
    • 一种测试类是否遵守协议的方法
    • @JohnJohnny if ([TheClass conformsToProtocol:@protocol(MyProtocol)])
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      来自API docs

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

      【讨论】:

        【解决方案4】:

        documentation 你的类符合协议,因为你在@interface 中声明它

        @interface Hat : NSObject <StandardQuality>
        

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

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

        @protocol StandardQuality <NSObject>
        
        @required
        - (NSString *)color;
        - (NSString *)fabric;
        - (NSString *)store;
        
        @optional
        - (NSString *)price;
        
        @end
        

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

        我认为你正在寻找更多。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-30
          • 2017-01-27
          • 2021-08-28
          • 2011-08-06
          • 2017-08-31
          • 2016-08-24
          • 2014-11-20
          相关资源
          最近更新 更多