2014-09-25 3 views
0

Учитываяпротокол подклассов и соответствие

@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

Вы получаете сообщение об ошибке или предупреждение? Я думаю, что добавление приведения должно решить следующее: «ListUsersResponse * result = (ListUserResponse *) [RequestExecutor execute: request receptor: [ListUsersResponse class]]'. PS: вы имели в виду '+ (id ) execute: (id ) request requestor: (Class) model;'? (ключевое слово 'id' отсутствует) – Yaman

+0

Да, предупреждение, извините. – 2014-09-25 13:27:26

+0

Да, исправлено это. Спасибо, решает это. Кроме того, если я изменю id для id, проблемы исчезнут, я заинтригован почему. – 2014-09-25 13:30:47

ответ

0

Эти предупреждения вызваны тем, что ваш метод RequestExecutorexecute: возвращает объект общего типа id<Response>. Переменные, однако, объявляются как ListUsersResponse *, поэтому компилятор ожидает более конкретного типа (и он не уверен, что этот тип применяется корректно или нет, он не знает).


Вы можете избавиться от предупреждения либо:

а) объявляя переменные с id<Response> типа вместо ListUsersRequest * типа, как:

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

Или

б) Литье их на лету (если вы уверены, что в этот момент они будут иметь соответствующий класс):

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

Но почему вы получаете сообщение об ошибке? – Droppy

+0

Объявление результата в виде id Способы соответствия DataResponse теряются. – 2014-09-25 13:37:40

+0

Они будут «потеряны» так же, как вы потеряете ListUserResponse. Вы можете бросить их, чтобы «вернуть их». –

Смежные вопросы