如何在NSObject上调用选择器而不将其转换为原始对象?

时间:2013-10-31 09:25:17

标签: objective-c

我实现了一项将数据发布到网络服务的功能。当我需要发送不同类型的数据时,我已经创建了这样的selctor:

- (void)postRequest:(NSString *)service toEndpoint:(NSString*)endpoint withParams:(NSObject *)params 

当我不知道它是什么类型的对象时,如何在params对象上运行方法? currentlig我已经为我发布的每种类型实施了测试场景,但这是实现这一目标的一种糟糕方式...... 像这样:

if([params isKindOfClass:[Order class]]){
  Order *order = (Order *) params;
  jsonString = [order objectToDictionary];
}

我已尝试过:

if ([params respondsToSelector:@selector(objectToDictionary:)]) {
  jsonString = [params objectToDictionary];
}

但是如果不将 params 强制转换为正确的类型,这似乎是不可能的。

3 个答案:

答案 0 :(得分:3)

使用id类型。 id是Objective-C中使用的特殊关键字,表示“某种对象。”

- (void)postRequest:(NSString *)service toEndpoint:(NSString*)endpoint withParams:(id)params

答案 1 :(得分:2)

使请求中发送的所有对象符合相同的协议。然后,您可以按如下方式定义方法签名:

- (void)postRequest:(NSString *)service toEndpoint:(NSString*)endpoint withParams:(id<YourPostRequestProtocol>)params;

然后在YourPostRequestProtocol中您可以定义方法

- (NSDictionary *)objectToDictionary;

每个对象,例如Order,可以符合该协议并实施该方法。

@interface Order : NSObject<YourPostRequestProtocol>

@end

@implementation

- (NSDictionary *)objectToDictionary
{
   // The implementation for this object
}

@end

答案 2 :(得分:0)

此外,您可以使用NSObject的子类,例如ParametersObject,并确保将在withParams参数上发送的所有对象都继承自此类。

此类必须实现所需的所有选择器,例如objectToDictionary: