Cant stocker int ou double dans le dictionnaire
Lorsque vous tentez de stocker un double ou un int dans un dictionnaire, j'obtiens une erreur
erreur: Sémantique Question: l'Envoi de "double" pour le paramètre de type incompatible "id"
J'ai le code suivant
[data setValue:longitude forKey:@"longitude"];
longitude est double.
Comment dois-je conserver? devrais-je créer un pointeur vers un int ou un double?
source d'informationauteur jarryd
Vous devez vous connecter pour publier un commentaire.
Que les autres postes ont dit, vous devez utiliser un
NSNumber
pour envelopper votre double de la valeur à un objet. La raison pour cela est que tout le Cocoa foundation classes de collection sont conçus pour travailler avec des objets plutôt que des valeurs primitives. Comme vous l'avez suggéré, avec peu de travail vous pouvez en effet passer un pointeur vers une valeur de type double (je pense que, si vous avez réussi à le jeter comme unid
de type pointeur), mais dès que votre méthode terminé et que le double est allé hors de portée, il serait libéré et votre pointeur serait maintenant pointer à la poubelle. Avec un objet, la collection (NSDictionary
dans ce cas) vous permettra de conserver vos objet lorsqu'il est ajouté et relâchez-le quand il est retiré ou la collection estdealloc
'ed, veillant à ce que votre valeur de survivre jusqu'à ce que vous en avez le plus besoin.Je le ferais comme suit:
NSNumber *tempNumber = [[NSNumber alloc] initWithDouble:longitude];
[data setValue:tempNumber forKey:@"longitude"];
[tempNumber release];
Qui laissera à vos NSNumber objet avec seulement un +1 compteur de référence (dictionnaire de soutènement) et pas de autoreleases
L'autre méthode suggérée de faire:
[data setValue:[NSNumber numberWithDouble: longitude] forKey:@"longitude"];
fonctionne également très bien, mais votre objet va se retrouver avec +1 compteur de référence d'un autorelease de la numberWithDouble méthode. Lorsque possible, j'essaie d'éviter autoreleases, mais le code est plus concis. YMMV.
Essayez d'utiliser un NSNumber:
Un dictionnaire veut un NSObject, pas un nombre ou un pointeur. Cependant, il est facile de créer un objet contenant un nombre:
qui vous pouvez de là stocker dans un NSDictionary.
Sous le capot: mylongitudeObject est un pointeur vers une structure opaque contenant une copie de votre nombre; mais la structure contient aussi de l'information, de sorte que l'Objectif C runtime sait ce qu'il peut faire avec cet objet, tels que la façon de le copier dans un dictionnaire, etc.
Vous devez utiliser un NSNumber objet à la place. Essayez de déclarer la longitude comme suit
NSNumber longitude = [NSNumber numberWithDouble:myLongitude]
Avec la nouvelle version du compilateur, vous pouvez utiliser l'Objective-C littérale de la syntaxe pour créer un NSNumber à partir d'une variable de type double: