Не могу хранить Int или двойной в словаре - PullRequest
14 голосов
/ 27 мая 2011

При попытке сохранить double или int в словаре я получаю сообщение об ошибке

ошибка: семантическая проблема: отправка «double» параметру несовместимого типа «id»

У меня есть следующий код

[data setValue:longitude forKey:@"longitude"];

долгота двойная.

Как мне хранить это? я должен просто создать указатель на int или double?

Ответы [ 5 ]

22 голосов
/ 27 мая 2011

Как указывалось в других сообщениях, вам нужно использовать NSNumber, чтобы обернуть ваше двойное значение в объекте. Причина этого в том, что все классы базовых коллекций Какао предназначены для работы с объектами, а не с примитивными значениями. Как вы и предлагали, с некоторой работой вы могли бы фактически передать указатель на двойное значение (я думаю, если бы вам удалось привести его как указатель типа id), но как только ваш метод завершился и удвоилось значение область будет освобождена, и ваш указатель теперь будет указывать на мусор. С объектом коллекция (NSDictionary, в данном случае) сохранит ваш объект при добавлении и освободит его, когда он будет удален или коллекция будет dealloc ', гарантируя, что ваша ценность сохранится, пока она вам не понадобится больше.

Я бы сделал это следующим образом:
NSNumber *tempNumber = [[NSNumber alloc] initWithDouble:longitude];<br> [data setValue:tempNumber forKey:@"longitude"];<br> [tempNumber release];
Который оставит ваш объект NSNumber только с количеством ссылок +1 (словарь сохраняет его) и без авто-выпусков

Другой предложенный метод выполнения:
[data setValue:[NSNumber numberWithDouble: longitude] forKey:@"longitude"];
также будет работать нормально, но ваш объект получит +1 счетчик ссылок и авто-релиз из метода numberWithDouble. По возможности я стараюсь избегать авто-выпусков, но код более лаконичен. YMMV.

6 голосов
/ 27 мая 2011

Попробуйте использовать NSNumber:

[data setValue:[NSNumber numberWithDouble: longitude] forKey:@"longitude"];
3 голосов
/ 27 мая 2011

Словарь хочет NSObject, а не число или указатель.Однако легко создать объект, содержащий число:

NSNumber *mylongitudeObject = [NSNumber numberWithDouble:myLongitude];

, которое вы можете затем сохранить в NSDictionary.

Под капотом: mylongitudeObject фактически будет указателем на непрозрачную структуру, содержащую копию вашего номера;но структура также содержит информацию, так что среда выполнения Objective C знает, что она может делать с этим объектом, например, как скопировать его в словарь и т. д.

2 голосов
/ 27 мая 2011

Вместо этого вы должны использовать объект NSNumber. Попробуйте объявить долготу следующим образом

NSNumber longitude = [NSNumber numberWithDouble:myLongitude]

1 голос
/ 24 июля 2017

В более новой версии компилятора вы можете использовать литеральный синтаксис Objective-C для создания NSNumber из переменной типа double:

double longitude = 2.0;
dict[@"longitude"] = @(longitude);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...