2014-01-31 23 views
2

我在此警告襲擊多個小時的參數......我越來越警告:「發送‘NSObject的*’到不兼容的類型‘身份證<NSCopying>’

的代碼,

-(NSMutableDictionary*)iOSDiction 
     { 
      NSMutableDictionary *tmpDic = [[NSMutableDictionary alloc] initWithCapacity:[m_coordDic count]]; 
      for (NSObject *key in [m_coordDic allKeys]) 
      { 
       [tmpDic setObject:[m_coordDic objectForKey:key] forKey:key]; //Warning 
      } 
      return tmpDic; 
     } 

警告:

「發送 'NSObject的*' 到不兼容的類型 '身份證' 的參數

傳遞參數參數aKey這裏

NSDictionary.h 

- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey; 

回答

2

NSDictionary鍵應符合NSCopying協議。這是NSDictionary參考中指定的密鑰的基本要求。一般來說,NSObject不符合協議(它的子類可能),所以你會收到警告。要做到這一點,正確的方法是

NSMutableDictionary *tmpDic = [[NSMutableDictionary alloc] initWithCapacity:[m_coordDic count]]; 
for (NSObject<NSCopying> *key in [m_coordDic allKeys]) 
{ 
    [tmpDic setObject:[m_coordDic objectForKey:key] forKey:key]; //Warning 
} 
return tmpDic; 

這可以確保您的關鍵是確認到NSCopying協議的任何對象。

編輯:看來你真的想要做的只是[m_coordDic mutableCopy],一個淺拷貝。任何你不這樣做的理由?

3

NSObject的不符合NSCopying。通過將變量作爲NSObject輸入,您告訴編譯器確保通過該變量發送的任何消息都由NSObject響應。由於NSObject不符合NSCopying,您會收到該錯誤消息。

如果您試圖告訴編譯器某個變量是某種對象,但不介意該類型,則應將其鍵入爲id。所以:

for (id key in m_coordDic) 

(順便說一句,你不需要allKeys快速列舉已經列舉鍵。)

+2

理想情況下,您希望'for(id in ...)'。 – rmaddy

+0

@rmaddy:也許這只是我的睡覺時間,但爲什麼更理想?我看不出有什麼變化。 – Chuck

+2

我個人覺得它有點更多自我記錄。它明確了密鑰的需要。 – rmaddy

1

這是由於不相容分配。所以,你應該用Particular object type或者id--> for any instances of object.

試試這個:

for (id key in [arr allKeys]) 
    { 
     [tmpDic setObject:[m_coordDic objectForKey:key] forKey:key]; //Warning 
    } 
+0

我不是在指責downVoter。讓我知道downVoting PLZ的原因.. –

+0

我最初因爲原來的答案錯誤(有關你不應該傳遞指針的東西)而降低了投票。然後你編輯,我試圖刪除downvote,但是SO不讓我。 – Chuck

+0

@Chuck謝謝,是的,我的假設是錯誤的(解釋)。所以我只刪除了那部分。 AnyHow感謝您的建議。 –

1

的NSDictionary鍵必須符合NSCopying協議。這就是id<NSCopying>的含義。

顯然,你已經與那些符合NSCopying的NSDictionary鍵的工作,但你申報你的key變量NSObject*,這本身不符合NSCopying

您需要聲明key確實符合NSCopying。你可以用NSObject<NSCopying>* key來做到這一點;不過,很多人會用id來代替。

id是一種特殊的類型,它告訴編譯器跳過任何類型的檢查。在簡單的情況下是這樣,使用id通常是精細:

for (id key in [myDictionary allKeys]) 
{ 
    // etc... 
} 
相關問題