Предупреждение: "Отправка" 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...
}