我在这里发帖this,我不确定代码的有效性。 但是我从来没有遇到过这样的事情或者读过这个(我刚开始做ObjectiveC)。这是代码示例
@implementation MyHTTPConnection
- (NSObject<HTTPResponse> *)httpResponseForMethod:(NSString *)method URI:(NSString *)path
{
HTTPLogTrace();
if ([path isEqualToString:@"/getElement"])
{
NSData *data = ...
HTTPDataResponse *response = [[HTTPDataResponse alloc] initWithData:data];
return response;
}
// default behavior for all other paths
return [super httpResponseForMethod:method URI:path];
}
@end
我的问题是这里的返回类型是什么?
(NSObject<HTTPResponse> *)
它在我看来是一个实现HTTPResponse对象的NSObject指针。 我认为它可以简单地写成这样的
NSObject *
我错过了什么吗?我不确定为什么选择上述内容。特别是与NSObject。任何建议,对此的澄清将不胜感激。
答案 0 :(得分:2)
这是实现NSObject
协议的HTTPResponse
。因此,您可以在返回的值上调用任何HTTPResponse
方法。
如果HTTPResponse
继承自NSObject
协议(与NSObject
类不同),那么通常的表达方式是id<HTTPResponse>
。但是NSObject<HTTPResponse> *
并没有错。
答案 1 :(得分:0)
这意味着
实现HTTPResponse协议的NSObject指针
所以你很亲密。它可能是NSObject *
,但是您丢失了编译器可以使用的大量信息,并且您需要进行大量的投射来弥补这一点。
在许多方面,最好使用id < HTTPResponse >
并确保HTTPResponse
协议扩展NSObject
协议,因为这为编译器提供了所需的保证,但也给出了底层对象类型的更大灵活性(例如使用NSProxy
)。