2015-04-05 105 views
1

我在這裏發現this後,我不知道代碼的有效性。 但是,我從來沒有遇到過這樣的事情,也沒有讀過關於這方面的任何事情(我剛剛開始objectiveC)。這裏是代碼示例需要澄清這個返回類型

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

它在我看來是一個實現HTTPResponse對象的NSObject指針。 我認爲它可以簡單地寫成這樣

NSObject * 

我錯過了什麼?我不確定爲什麼會選擇上述內容。特別是與NSObject。任何建議,澄清這將不勝感激。

回答

2

這是執行HTTPResponse協議的NSObject。所以你可以調用任何返回值的HTTPResponse方法。

如果HTTPResponse繼承自NSObject協議(與NSObject類不同),那麼通常表達方式是id<HTTPResponse>。但是NSObject<HTTPResponse> *沒有錯。

0

這意味着

一個實現類HTTPResponse協議

所以你很接近

NSObject的指針。它可能是NSObject *,但是你會失去很多編譯器可以使用的信息,並且需要進行大量的投射來彌補這一點。

在許多方面這將是最好使用id <HTTPResponse>和,以確保HTTPResponse協議擴展NSObject協議,因爲這提供所需的保證到編譯器,但也給出了在基礎對象類型到更大的靈活性(例如使用NSProxy)。