stringValue de NSDictionary objectForKey erreur d'exécution
J'ai donc le code suivant provoque une erreur d'exécution dans XCode
NSString* temp = [[param objectforkey@"firstParam"] stringValue];
int tempNum = [[param objectforkey@"secondParam"] intValue];
param charge à partir d'un fichier plist. firstParam est comme une chaîne de caractères, secondParam est un nombre
Première ligne bloque le programme.
Maintenant ce qui est intéressant, c'est qu'il fonctionne si je fais un dur caste j'.e:
NSString* temp = (NSString*)[param objectforkey@"firstParam"];
int tempNum = [[param objectforkey@"secondParam"] intValue];
Demandais juste pourquoi l'id serait mise en œuvre incohérente dans ce que j'ai à utiliser intValue à cast en int, mais ont à faire dur en fonte pour obtenir NSString? Pourquoi ne pas stringValue?
OriginalL'auteur snowbound | 2013-06-08
Vous devez vous connecter pour publier un commentaire.
Votre premier appel à
objectForKey
retourne un objet qui est uneNSString
.NSString
n'ont pas destringValue
méthode qui est pourquoi une erreur d'exécution est générée. Il n'a pas de sens pour obtenir lestringValue
de quelque chose qui est déjà une chaîne de caractères.Le deuxième appel à
objectForKey
retourne unNSNumber
.NSNumber
a unintValue
méthode afin de ne pas provoquer une erreur.Dans le second cas, vous modifiez le type de la valeur retournée de
NSNumber
àint
. Dans le premier cas, l'objet retourné est déjà unNSString
et il est inutile de tenter d'obtenir lestringValue
d'une chaîne.NSString
? Je thaugthstringValue
serait l'équivalent de javatoString
et donc toujours disponible.Si vous ne savez pas quel type d'objet à récupérer à partir de votre collection, vous aurez à examiner l'objet pour voir quel type il est, avant d'appeler la méthode appropriée(s).
OriginalL'auteur mttrb
L'appel
[param objectforkey@"firstParam"]
retourne un NSString, donc il n'y a pas besoin d'appeler stringValue. En outre, NSString ne dispose pas d'une méthode appelée "stringValue", de sorte que la source de votre problème.Appelez simplement ceci:
NSString *temp = (NSString *)[param objectForKey:@"firstParam"];
Également noter que le sélecteur est objectForKey:, pas objectforkey: (capitalisation).
Et, pour répondre à votre question, NSNumber est une classe, de sorte que tout objet n'est pas un "int", mais un NSNumber pointeur. intValue retourne un "int", comme floatValue retourne un "float" (NSNumber peut représenter n'importe quel type de nombre). Dans le cas de la NSString ce n'est pas nécessaire, car il n'existe qu'un seul type de NSString (il y a, cependant, une méthode pour retourner un
const char *
, et qui serait utilisé commechar *string = [[param objectForKey:@"firstParam"] cString];
... pas très utile pour Objective-C apps de toute façon).OriginalL'auteur Alejandro Iván
Permet de dire que vous appeler un service web qui renvoie du JSON
Alors vous traiter les données
maintenant à vous d'essayer quelque chose de ce genre
ensuite, vous obtenez l'erreur....
Comme mttrb parle de vous obtenez le message d'erreur en raison de stringValue, objectForKey valeur de retour par défaut est une Chaîne donc une solution possible serait dans ce cas:
Espère que cette conseils de certains!
OriginalL'auteur d1jhoni1b
Si vous ne pouvez pas être sûr que la valeur retournée est un
NSString
ce faire, vous devez:OriginalL'auteur Torge
Compléter la réponse de @Torge, j'ajoute ma solution pour obtenir toujours un NSString de objectForKey méthode:
OriginalL'auteur jmartinalonso