简体   繁体   中英

Protocol subclassing and conformance

Given

@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]];

I get an Initializing 'ListUsersResponse *__strong' with an expression of incompatible type 'id<Response>' error. Why is that? Cant the compiler detect protocol conformance? How to solve it?

These warning is because your RequestExecutor 's execute: method returns an object of a general id<Response> type. The variables, however, are declared as ListUsersResponse * so the compiler expects a more specific type (and it isn't sure if that type cast is correct or not, it has no way of knowing).


You can get rid of the warning by either:

a) Declaring your variables with id<Response> type instead of ListUsersRequest * type like:

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

Or

b) Casting them on the fly (if you are sure that at that point they will be of the appropriate class):

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM