警告:“将'NSObject *'发送到不兼容类型的参数'id <nscopying>'</nscopying>

时间:2014-01-31 06:04:21

标签: ios objective-c ios7 nsdictionary 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 *'发送到不兼容类型的参数   'ID'

将参数传递给参数aKey

NSDictionary.h

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

4 个答案:

答案 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 typeid--> 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...
}