3

我被这个警告震惊了好几个小时......我得到了

代码是,

-(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

4 回答 4

5

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]一个浅拷贝。你有什么理由不这样做?

于 2014-01-31T06:21:15.433 回答
3

NSObject 不符合 NSCopying。通过将变量键入为 NSObject,您是在告诉编译器确保您通过该变量发送的任何消息都由 NSObject 响应。由于 NSObject 不符合 NSCopying,因此您会收到该错误消息。

如果您试图告诉编译器变量是某种对象,但不管类型,您应该将其键入为id. 所以:

for (id key in m_coordDic)

(顺便说一句,您不需要 allKeys。快速枚举已经枚举了键。)

于 2014-01-31T06:13:29.227 回答
1

这是由于不兼容的 Assignment。所以你应该使用Particular object typeOrid--> for any instances of object.

试试这个 :

 for (id key in [arr allKeys])
    {
        [tmpDic setObject:[m_coordDic objectForKey:key] forKey:key];  //Warning
    }
于 2014-01-31T06:14:15.037 回答
1

NSDictionary 键必须符合NSCopying协议。就是这个id<NSCopying>意思。

显然,您已经在使用符合 的 NSDictionary 键NSCopying,但您已将key变量声明为NSObject*,它本身不符合NSCopying

您需要声明key确实符合NSCopying. 你可以用NSObject<NSCopying>* key; 但是,很多人会id改用。

id是一种特殊类型,它告诉编译器跳过任何类型检查。在像这样的简单情况下,使用id通常很好:

for (id key in [myDictionary allKeys])
{
    // etc...
}
于 2014-01-31T06:17:49.713 回答