Cant хранить int или double в словаре

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

error: Semantic Issue: Отправка 'double' параметру несовместимого типа 'id'

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

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

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

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

Ответы

Ответ 1

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

Я бы сделал это следующим образом:
NSNumber *tempNumber = [[NSNumber alloc] initWithDouble:longitude];
[data setValue:tempNumber forKey:@"longitude"];
[tempNumber release];

Который оставит ваш объект NSNumber только с номером ссылки +1 (словарь сохраняет его) и без автореализаций

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

Ответ 2

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

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

Ответ 3

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

NSNumber *mylongitudeObject = [NSNumber numberWithDouble:myLongitude];

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

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

Ответ 4

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

NSNumber longitude = [NSNumber numberWithDouble:myLongitude]

Ответ 5

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

double longitude = 2.0;
dict[@"longitude"] = @(longitude);