Предупреждение: "Отправка" NSObject * "параметру несовместимого типа" id<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 ответа

Решение

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]мелкая копия. По какой причине вы этого не делаете?

NSObject не соответствует NSCopying. Вводя переменную как NSObject, вы сообщаете компилятору, чтобы NSObject отвечал на все сообщения, отправляемые вами через эту переменную. Поскольку NSObject не соответствует NSCopying, вы получите это сообщение об ошибке.

Если вы пытаетесь сообщить компилятору, что переменная - это некий объект, но не обращаете внимания на тип, вы должны ввести его как id, Так:

for (id key in m_coordDic)

(Кстати, вам не нужны allKeys. Быстрое перечисление уже перечисляет ключи.)

Это связано с несовместимым назначением. Так что вы должны использовать Particular object type Или же id--> for any instances of object.

Попробуй это:

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

Ключи NSDictionary должны соответствовать NSCopying протокол. Это то что id<NSCopying> средства.

Очевидно, вы уже работаете с ключами NSDictionary, которые соответствуют NSCopying, но вы объявили свой key переменная как NSObject*что само по себе не соответствует NSCopying,

Вы должны заявить, что key соответствует NSCopying, Вы можете сделать это с NSObject<NSCopying>* key; Однако многие люди будут использовать id вместо.

id это специальный тип, который говорит компилятору пропускать любую проверку типов. В простом случае, как это, используя id обычно хорошо:

for (id key in [myDictionary allKeys])
{
    // etc...
}
Другие вопросы по тегам