协议子类和一致性

时间:2014-09-25 13:17:29

标签: ios objective-c macos cocoa llvm

鉴于

@protocol Response <NSObject>
@end

@protocol DataResponse <Response>
@end

@interface ListUsersResponse : NSObject <DataResponse>
@end

@interface RequestExecutor : NSObject
+(id<Response>) execute: (id<Request>) request receptor: (Class) model;
@end

ListUsersRequest * request = [self buildListUsersRequest];
ListUsersResponse * result = [RequestExecutor execute:request receptor:[ListUsersResponse class]];

我收到Initializing 'ListUsersResponse *__strong' with an expression of incompatible type 'id<Response>'错误。这是为什么?编译器是否检测到协议一致性?怎么解决?

1 个答案:

答案 0 :(得分:0)

这些警告是因为您的RequestExecutor execute:方法返回了一般id<Response>类型的对象。但是,变量被声明为ListUsersResponse *,因此编译器需要更具体的类型(并且它不确定该类型转换是否正确,它无法知道)。


你可以通过以下方式摆脱警告:

a)使用id<Response>类型而不是ListUsersRequest *类型声明变量,如:

id<Response> result = [RequestExecutor execute:request receptor:[ListUsersResponse class]];

或者

b)即时投射它们(如果你确定那时它们将属于适当的类别):

ListUsersResponse *result = (ListUsersRequest *)[RequestExecutor execute:request receptor:[ListUsersResponse class]];