2015-04-05 2 views
1

Я наткнулся на this, и я не уверен в действительности кода. Однако я никогда не сталкивался с чем-то вроде этого или ничего не читал об этом (я только начал objectC). Вот пример кодаНужно уточнить этот тип возврата

@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> *) 

Он выглядит как указатель NSObject, который реализует объект HTTPResponse. Я придерживаюсь мнения, что это может быть просто написано, как этот

NSObject * 

я упускаю что-нибудь? Я не знаю, почему было выбрано выше. Особенно с NSObject. Любые предложения, разъяснения по этому вопросу будут оценены.

ответ

2

Это NSObject, который реализует протокол HTTPResponse. Таким образом, вы можете вызвать любые HTTPResponse методы по возвращаемому значению.

Если HTTPResponse наследует от NSObject протокола (который отличается от NSObject класса), то обычный способ выразить это id<HTTPResponse>. Но NSObject<HTTPResponse> * не ошибается.

0

Это означает

NSObject указатель, который реализует протокол HTTPResponse

Таким образом, вы были близки. Это может быть NSObject *, но вы потеряете много информации, которую может использовать компилятор, и вам нужно будет сделать много кастингов, чтобы компенсировать это.

В ряде способов было бы лучше использовать id <HTTPResponse> и обеспечить, чтобы протокол HTTPResponse продлил протокол NSObject поскольку это обеспечивает необходимые гарантии компилятора, но и дает большую гибкость в основном типе объекта (например, для используйте NSProxy).

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