我被这个警告打了很长时间......我得到了
代码是,
-(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 *'发送到不兼容类型的参数 'ID'
将参数传递给参数aKey
NSDictionary.h
- (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
答案 0 :(得分:4)
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]
,一个浅层副本。你有没有这样做的原因?
答案 1 :(得分:3)
NSObject不符合NSCopying。通过键入变量为NSObject,您告诉编译器确保通过该变量发送的任何消息都由NSObject响应。由于NSObject不符合NSCopying,因此您会收到该错误消息。
如果您试图告诉编译器某个变量是某种对象,但从不介意该类型,则应将其键入id
。所以:
for (id key in m_coordDic)
(顺便说一句,你不需要allKeys。快速枚举已经枚举了密钥。)
答案 2 :(得分: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
}
答案 3 :(得分:1)
NSDictionary密钥必须符合NSCopying
协议。这就是id<NSCopying>
的含义。
显然,您已经在使用符合NSCopying
的NSDictionary密钥,但您已将key
变量声明为NSObject*
,它本身不符合{NSCopying
1}}。
您需要声明key
符合NSCopying
。您可以使用NSObject<NSCopying>* key
执行此操作;但是,很多人会改用id
。
id
是一种特殊类型,它告诉编译器跳过任何类型检查。在这种简单的情况下,使用id
通常很好:
for (id key in [myDictionary allKeys])
{
// etc...
}