J'ai un Comment puis-je faire cela? Y a-t-il une API intégrée disponible pour faire cela? P>
Merci tout le monde .. p> nsmutabledictionner (code>. Je dois renommer de manière dynamique une clé
code> dans le dictionnaire à une nouvelle valeur, dans mon code .. Je ne trouve pas d'API intégrée pour le faire .. p>
4 Réponses :
// assumes that olkdey and newkey won't be the same; they can't as // constants... but... [dict setObject: [dict objectForKey: @"oldkey"] forKey: @"newkey"]; [dict removeObjectForKey: @"oldkey"]; Think about what "directly editing an existing key" means. A dictionary is a hash; it hashes the contents of the keys to find a value.What happens if you were to change the contents of a key? The key would need to be rehashed (and the dictionary's internal structures re-balanced) or the value would no longer be retrievable.Why do you want to edit the contents of a key in the first place? I.e. what problem does that solve that the above does not?
Merci .. Ça va bien .. Je ne peux pas modifier directement une clé existante?
Mmm .. rien de spécifique .. Je suis juste attendu d'une manière directe d'éditer la clé .. c'est ça .. merci man ..
Merci @bbum, cela a également travaillé pour un Nsuserdefault!
Cela échoue si oldkey code> est égal à
newkey code>
@de. Dans l'exemple de grave, il ne peut pas échouer car ils ne sont pas des variables. Mais certainement la peine de noter!
Cela devrait fonctionner: Cela fait exactement la même chose que la réponse de BBum, mais si vous supprimez l'ancienne clé en premier (comme dans cet exemple), vous devez conserver l'objet temporairement autrement. Il pourrait être distribué de manière distribué;) p> Conclusion: sauf si vous avez besoin explicitement pour supprimer l'ancienne clé en premier comme BBum. P> P>
Ceci est également nettement plus défensif et général; Si Oldkey et Newkey étaient la même chaîne, cela fonctionne toujours (bien que cela fait du travail supplémentaire).
@interface NSMutableDictionary (KAKeyRenaming) - (void)ka_replaceKey:(id)oldKey withKey:(id)newKey; @end @implementation NSMutableDictionary (KAKeyRenaming) - (void)ka_replaceKey:(id)oldKey withKey:(id)newKey { id value = [self objectForKey:oldKey]; if (value) { [self setObject:value forKey:newKey]; [self removeObjectForKey:oldKey]; } } @end This also handles the case where the dictionary doesn't have a value for the key nicely.
Une autre belle solution; Mais préfixez ces méthodes avec quelque chose qui n'est pas générique et potentiellement susceptible de collider avec un ajout futur au cadre, s'il y avait déjà une ....
@bbum a raison: préfixer les classes personnalisées et les protocoles doivent être considérés comme une exigence. Édité pour l'amour de la perfection.
Le nom de la catégorie n'a pas d'importance; n'est pas disponible au moment de l'exécution. Ce sont les noms de méthode que vous devez vous inquiéter ....
Quel est le résultat lorsque les anciennes et les nouvelles clés sont identiques. Cela peut sembler une question stupide, mais malheureusement, je suis tombé sur une situation similaire. Les clés sont identiques dans quelques cas, différence dans le cas (supérieure, inférieure ou combinée) de la chaîne. Je reçois les clés du serveur et je ne peux pas compter que les deux seraient différents et que le client mobile devrait également être prêt à agir dans de tels cas. Veuillez commenter si vous avez une solution à ce scénario.
Je dois naviguer un objet de réponse JSON complet qui contient des champs, des sous-dictionnaires et des sous-tableaux. Tous parce que l'un des champs JSON est appelé "retour" qui est un mot réservé iOS, vous ne pouvez donc pas être utilisé avec le JSONMODEL COCOA POD . Voici le code:
+ (id) sanitizeJSON:(id) dictIn { if (dictIn) //check not null { // if it's a dictionary item if ([dictIn isKindOfClass:[NSDictionary class]]) { NSMutableDictionary *dictOut = [dictIn mutableCopy]; // Do the fix replace "return" with "not_return" if ([dictOut objectForKey: @"return"]) {[dictOut setObject: [dictIn objectForKey: @"return"] forKey: @"not_return"]; [dictOut removeObjectForKey: @"return"];} // Continue the recursive walk through NSArray*keys=[dictOut allKeys]; //get all the keys for (int n=0;n<keys.count;n++) { NSString *key = [keys objectAtIndex:n]; //NSLog(@"key=%@ value=%@", key, [dictOut objectForKey:key]); if (([[dictOut objectForKey:key] isKindOfClass:[NSDictionary class]]) || ([[dictOut objectForKey:key] isKindOfClass:[NSArray class]])) { // recursive call id sanitizedObject = [self sanitizeJSON:[dictOut objectForKey:key]]; [dictOut removeObjectForKey: key]; [dictOut setObject:sanitizedObject forKey:key]; // replace returned (poss modified) item with this one } } return dictOut; //return dict } else if ([dictIn isKindOfClass:[NSArray class]]) //Or if it's an array item { NSMutableArray *tempArray = [dictIn mutableCopy]; // Do the recursive walk across the array for (int n=0;n< tempArray.count; n++) { // if array item is dictionary if (([[tempArray objectAtIndex:n] isKindOfClass:[NSDictionary class]]) || ([[tempArray objectAtIndex:n] isKindOfClass:[NSArray class]])) { // recursive call id sanitizedObject = [self sanitizeJSON:[tempArray objectAtIndex:n]]; // replace with the possibly modified item [tempArray replaceObjectAtIndex:n withObject:sanitizedObject]; } } return tempArray; //return array } return dictIn; //Not nil or dict or array } else return dictIn; //return nil }
Est-ce une option de copier la valeur, puis créez une nouvelle clé avec le nom souhaité?
Je ne peux pas directement éditer une clé existante?