鉴于
@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>'
错误。这是为什么?编译器是否检测到协议一致性?怎么解决?
答案 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]];