我是Objective-C的新手。我来自Java背景。我试图在objective-c中创建一个泛型函数,如下所示:
- (id<BaseEntity>*)retreive:(NSString *)idValue unpackedWith:(id<ITransferObject>*) transferObject{
NSString * url = [[[self baseUurl] stringByAppendingString: [self getPath]]stringByAppendingString: @"/retreive/"];
url = [url stringByAppendingString:idValue];
NSMutableURLRequest *request = [self createGET:url];
NSString *responseString = [self processRequest:request];
BaseEntity* responseEntity = [transferObject unpack:responseString];
return responseEntity;
}
我要完成的是创建一个函数,该函数可以获取指向实现ITransferObject协议的任何对象的指针。在ITransferObject协议中定义的此对象上使用函数。然后返回指向实现BaseEntity协议的对象的指针。我觉得我采用了Java泛型方法,但它没有用。
我收到以下错误:
Bad receiver type `__autoreleasing id<ITransferObject> *'
从这一行:
BaseEntity* responseEntity = [transferObject unpack:responseString];
我收到错误:
Implicit conversion of an Objective-C pointer to `__autoreleasing id<BaseEntity> *' is disallowed with ARC
从这一行:
return responseEntity;
有什么想法吗?
答案 0 :(得分:3)
id
本身就是一个指针类型 - 你不需要像对类一样附加一个*来表示指针。
- (id<BaseEntity>)retrieve:(NSString *)idValue unpackedWith:(id<ITransferObject>)transferObject
答案 1 :(得分:1)
首先,看起来BaseEntity
是一个类,而不是协议,所以你不能将它用作协议。
其次,id
类型本质上是一个指针,因此您通常不希望声明一个指针 - id
。
改为声明你的方法:
- (BaseEntity *)retreive:(NSString *)idValue unpackedWith:(id<ITransferObject>) transferObject{
(请注意,我已删除transferObject
更改了*
类型。)
或者,使用NSObject
代替id
并留下明星,即:
- (BaseEntity*)retreive:(NSString *)idValue unpackedWith:(NSObject<ITransferObject>*) transferObject{
另外,正确的拼写是retrieve
。
答案 2 :(得分:1)
id
是一种特殊类型 - 它是一种不需要星号的引用类型:它已经是一个指针。这是一个说明这一点的例子:
-(void)someMethod:(id)data; // id does not need an asterisk
...
NSString *str = @"Hello"; // NSString needs an asterisk
[self someMethod:str]; // This works
在id
之后添加星号使类型成为指向id
的指针 - 即双指针。当您需要指向id
的指针时,有合理的情况,但这不是您所需要的。
您有两种方法可以解决此问题:
id
NSObject
(类似于在Java中传递Object
)或id
。第二种方法更常见:
- (id<BaseEntity>)retreive:(NSString *)idValue unpackedWith:(id<ITransferObject>) transferObject;