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

iPhone如何指定类数据类型必须采用协议

  •  2
  • vodkhang  · 技术社区  · 14 年前

    在我的应用程序中,我需要将“class”作为返回类型返回,例如:

    应用:M:

    + (Class)getParserClass {
      return [NCCurrencyParser class];
    }
    

    nccurrencyParser.m:货币分析程序

    @interface NCCurrencyParser NSObject <NCParser>
    @protocol NCParser
      +(NSNumber *)parserNumber:(NSNumber *)number;
    

    在调用方方法中:

    Class parserClass = [Application getParserClass];
    [parserClass parserNumber:1.0];
    

    但是编译器给了我一个错误,parserClass可能不会响应parseNumber。我怎样才能强迫这个类采用一些协议,比如: Class <NCParser> (但不起作用)

    3 回复  |  直到 8 年前
        1
  •  3
  •   Akusete    14 年前

    等级 目标C中的对象是 头等舱 对象,并且可以像其他任何Object-C对象(ID、nsObject*、…)一样实现协议。

    所以,只要做你通常会做的任何其他对象协议,即:

    + (Class<NCParser>)getParserClass {
      return [NCCurrencyParser class];
    }
    

    Class<NCParser> parserClass = [Application getParserClass];
    [parserClass parserNumber:1.0];
    

    在Xcode 3.2.3、iPhone模拟器4.0、GCC 4.2上构建/编译/测试

        2
  •  1
  •   jotik    8 年前

    发生了什么事…这似乎是大错特错。

    但做 Class<NCParser> parserClass = [Application getParserClass]; 应该工作

        3
  •  0
  •   KONG    14 年前

    但是编译器给了我 ParserClass可能没有响应的错误 “副数”

    如果您只需要忽略错误消息。 将其放入具有调用方方法的类中:

    #import "NCParser.h"
    

    会解决你的问题。它只是工作!

    我认为xcode基于您的导入来确定 Class .

    “我怎样才能强迫全班同学 采用一些协议,如:类”

    你可以检查 NCObject id 在编译时使用 id <AProtocol> . 但我认为你不能为了 等级 对象。

    我的方法是在运行时检查它。这样地:

    NSObject *object = [[class alloc] init];
    NSAssert ([object conformsToProtocol:@protocol(AProtocol)], 
              @"`class` should conform AProtocol");