iphone如何指定Class数据类型必须采用一个协议

时间:2010-07-19 04:22:59

标签: iphone objective-c protocols

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

Application.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 个答案:

答案 0 :(得分:3)

Objective-C中的

对象是第一类对象,可以像任何其他Objective-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上构建/编译/测试

答案 1 :(得分:1)

发生了什么......这看起来非常错误。

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

答案 2 :(得分:0)

  

“然后编译器给了我   parserClass可能无法响应的错误   to parseNumber“

如果您只是需要忽略错误消息。 把它放在具有调用方法的类中:

#import "NCParser.h"

将解决您的问题。它只是有效!

我认为XCode基于您的导入来确定Class的方法。

  

“我怎么能强迫班级必须这样做   采用一些协议,如:Class“

您可以使用NCObject在编译时检查idid <AProtocol>是否符合协议。但我认为你不能为Class对象做到这一点。

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

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