Objective-C协议作为另一个协议的参数

时间:2013-05-21 15:29:31

标签: objective-c objective-c-protocol

我正在尝试创建一个访问我的web api的通用存储库(模式)。我无法理解协议如何在objective-c中工作(我来自c#,其中接口有点不同)。

我要做的是让ProtocolA成为另一个ProtocolB中的参数,然后是ProtocolA上ProtocolB访问方法的实现,因为传入ProtocolB的对象必须实现ProtocolA本身。我是否正确地考虑过这个问题?

这是我迄今为止所做的,但似乎无法让它发挥作用 - 也许我的逻辑错了:

//PGenericModel.h
@protocol PGenericModel <NSObject>
- (void)testMethod;
@end


//PGenericRepository.h
#import "PGenericModel.h"
@protocol PGenericRepository <NSObject>
@required
- (void)Get:(id<PGenericModel>*)entity;
@end


//GenericRepository.m
#import "GenericRepository.h"
@implementation GenericRepository
- (void)Get:(id<PGenericModel>*)entity
{
    //GET
    [entity testMethod] <-- this doesn't work...
}
@end

1 个答案:

答案 0 :(得分:6)

它不起作用,因为id类型已经是指向Objective-c对象的指针。

所以你应该将签名声明为

- (void)Get:(id<PGenericModel>)entity

不是id<PGenericModel>*,否则参数将是指向Objective-C对象的指针,除非得到具体的值,否则不能向它发送消息。