2014-05-13 50 views
0

這是一個新手問題。我有一個如下所示的對象(例如MyObject.h)。我該如何爲協議分配一個NSMutableArray?

#import <Foundation/Foundation.h> 
#import "JSONModel.h" 
@protocol MyObject 
@end 
@interface MyObject : JSONModel 
@property (strong,nonatomic) NSString* name; 
@end 

然後執行如下所示(例如MyObject.m)。

#import "MyObject.h" 
@implementation MyObject 
@end 

在其他地方我的代碼,我再定義一個NSMutableArray如下。

NSMutableArray<MyObject>* list; 
list = [[NSMutableArray alloc] init]; 

我得到這個警告。

不兼容的指針類型從 '的NSMutableArray'

分配 '的NSMutableArray <爲MyObject > ' 我從仿製知道不支持外的現成的收藏集的Objective-C(這也不是我在這裏要做的),但我的NSMutableArray被定義爲這樣的協議MyObject,因爲我是trying to follow the examples from "JSONModel's" GitHub page

該代碼仍在編譯,但上述警告。我如何

  • 使警告消失,或
  • 分配/初始化正確NSMutableArray

更新:

我繼續尋找如何擺脫這一警告的,而且事實證明,如果我創建一個NSMutableArray像下面,警告消失(和項目編譯沒有錯誤)。我會寫一個單元測試,看看它是否按預期工作。

list = (id)[NSMutableArray new]; 
+1

您認爲''完成了什麼? –

+0

我很驚訝它沒有給出錯誤信息。只有協議應該用在<>中,而不是類。 – Bedford

+0

但該協議已實施。 '@protocol MyObject @ end' – Gonzo

回答

5
NSMutableArray<MyObject>* 

這並不意味着你認爲這意味着什麼。這不是「符合<MyObject>的東西的NSMutableArray」。這是「NSMutableArray的一個子類,它本身符合<MyObject>」。

我不知道你提供的鏈接是試圖實現的。也許他們分類NSArray,或者他們可能已經裝飾NSArray與試圖符合協議的類別。在任何一種情況下,這都是有點危險和瘋狂之間。我會和他們談談他們的想法。我的懷疑是,他們這樣做是爲了裝飾,似乎意味着什麼,事實上沒有任何意義。 (這不是聞所未聞的。蘋果做它自己與CFPropertyListRef,這似乎意味着什麼,但實際上是const void*,當你想到,還沒有出現一個警告,這是相當驚人的。)

要怎麼走的問題擺脫了警告,只是擺脫了不正確的協議裝飾。它應該是NSMutableArray*,而不是NSMutableArray<something>*

順便說一句,這個代碼給你零和可以忽略不計效益之間:

NSMutableArray<MyObject>* list = (id)[NSMutableArray new]; 

它給你一個微小的好處在於,list = someOtherKindOfList以後的調用將給予警告,但是這是一個令人難以置信的不尋常的操作(90無論如何你都必須投射它的時間百分比,所以警告幾乎不會發現真正的錯誤)。然而,最值得注意的是,如果你做[list addObject:someRandomType],它不會發出警告,這是在這裏犯錯的最常見的方式。所以這對裝飾沒有意義。

+1

如果你真的想像你說的那樣說話我準備好傾聽 - JSONModel背後沒有團隊,只是我 –

相關問題