Comment ajouter à un NSDictionary

91

J'utilisais un NSMutableArrayet je me suis rendu compte que l'utilisation d'un dictionnaire est beaucoup plus simple pour ce que j'essaie de réaliser.

Je veux enregistrer une clé en tant que NSStringet une valeur en tant que intdans le dictionnaire. Comment cela se fait-il? Deuxièmement, quelle est la différence entre mutable et un dictionnaire normal?

système
la source

Réponses:

197

Un dictionnaire mutable peut être modifié, c'est-à-dire que vous pouvez ajouter et supprimer des objets. Un immuable est fixé une fois qu'il est créé.

créer et ajouter:

NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:10];
[dict setObject:[NSNumber numberWithInt:42] forKey:@"A cool number"];

et récupérez:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];
Eiko
la source
Devez-vous initier avec une capacité ou peut-il simplement être dynamique?
muttley91
2
Vous n'êtes pas obligé de spécifier la capacité initiale, mais vous constaterez peut-être des gains de performances si vous le faites. Si vous savez d'avance combien d'articles il contiendra, indiquez ce nombre ou une valeur légèrement supérieure.
Eiko
demander NSDictionary et non NSMutableDictionary?
Ananta Prasad
34

En définissant, vous utiliseriez la setValue:(id)value forKey:(id)keyméthode de l' NSMutableDictionaryobjet:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSNumber numberWithInt:5] forKey:@"age"];

Ou en Objective-C moderne:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"age"] = @5;

La différence entre mutable et «normal» est, eh bien, la mutabilité. C'est-à-dire que vous pouvez modifier le contenu de NSMutableDictionary(et NSMutableArray) alors que vous ne pouvez pas le faire avec "normal" NSDictionaryetNSArray

Eimantas
la source
2
Ne devriez-vous pas envelopper cet entier dans un NSNumber?
Johan Kool
J'ai un autre problème avec cela. Je dois stocker un texte saisi par l'utilisateur sous forme de chaîne ainsi que la référence d'image (l'index dans le tableau d'images) dans laquelle l'utilisateur enregistre le texte. J'ai essayé un mutableArray d'objets qui ont 2 variables, une pour chacune que je viens de mentionner. cela ne fonctionnait pas bien lors de la tentative de remplissage de tableView avec les valeurs de texte des objets du tableau. Donc j'ai pensé à un dictionnaire, le seul problème est qu'il ne semble pas que je puisse récupérer des données par index, il doit s'agir d'une clé ou d'une valeur comme un hashmap, n'est-ce pas?
système du
@Johan - correct et mis à jour! @alJaree - oui, le dictionnaire est une sorte de magasin clé-valeur. Je pense que dans votre position, vous seriez mieux avec une gamme de dictionnaires. Quelque chose comme[{image: "/path/to/img/1.jpg", data: "foo bar 1"}, {image: "/path/to/img/2.jpg", data: "foo bar 2"}, ..., {image: "/path/to/img/N.jpg", data: "foo bar N"}]
Eimantas
Cela ne fonctionnera toujours pas pour moi, car je dois récupérer le texte de chaque objet et l'utiliser pour remplir les favoris UITableView ainsi que j'ai besoin d'une référence d'index au tableau d'images afin de pouvoir récupérer et afficher l'image préférée sélectionnée. J'ai essayé l'objet que j'ai décrit ci-dessus, mais les objets retournés lors de la lecture du tableau où NSStrings pour une raison quelconque plutôt que l'objet spécifique qui a été stocké. Je ne sais pas quoi faire ici,
système du
Je pense que je devrai peut-être simplement stocker des NSStrings telles que @ "% d _% @, index, savedTitle, puis diviser la NSString et prendre et dipay ce dont j'ai besoin. Je pense en termes java, bien sûr qu'il doit y avoir un fonction split dans obj c. :)
système
16

Chaque fois que le tableau est déclaré, alors seulement nous devons ajouter la valeur-clé dans NSDictionary comme

NSDictionary *normalDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"Value1",@"Key1",@"Value2",@"Key2",@"Value3",@"Key3",nil];

nous ne pouvons pas ajouter ou supprimer les valeurs de clé dans ce NSDictionary

Où, comme dans NSMutableDictionary, nous pouvons ajouter les objets après l'initialisation du tableau également en utilisant cette méthode

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]init];'
[mutableDict setObject:@"Value1" forKey:@"Key1"];
[mutableDict setObject:@"Value2" forKey:@"Key2"];
[mutableDict setObject:@"Value3" forKey:@"Key3"];

pour supprimer la valeur de clé, nous devons utiliser le code suivant

[mutableDict removeObject:@"Value1" forKey:@"Key1"];
Madhu
la source
12

Version de mise à jour

Objectif c

Créer:

NSDictionary *dictionary = @{@"myKey1": @7, @"myKey2": @5}; 

Changement:

NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];     //Make the dictionary mutable to change/add
mutableDictionary[@"myKey3"] = @3;

La syntaxe abrégée est appelée Objective-C Literals.

Rapide

Créer:

var dictionary = ["myKey1": 7, "myKey2": 5]

Changement:

dictionary["myKey3"] = 3
Warif Akhand Rishi
la source
1

Vous voulez demander "quelle est la différence entre un tableau ou un dictionnaire mutable et non mutable". Plusieurs fois, différents termes sont utilisés pour décrire des choses que vous connaissez déjà. Dans ce cas, vous pouvez remplacer le terme «mutable» par «dynamique». Ainsi, un dictionnaire ou un tableau mutable est un dictionnaire "dynamique" et peut changer à l'exécution, alors qu'un dictionnaire ou un tableau non mutable est un dictionnaire "statique" et défini dans votre code et qui ne change pas à l'exécution (en d'autres termes , vous n'ajouterez pas, ne supprimerez pas ou ne trierez pas les éléments.)

Quant à la manière de procéder, vous nous demandez de répéter la documentation ici. Tout ce que vous avez à faire est de rechercher un exemple de code et la documentation Xcode pour voir exactement comment cela est fait. Mais la chose mutable m'a aussi jeté quand j'ai appris pour la première fois, alors je vais vous donner celle-là!

Mark Hernandez
la source
Parfois, il n'y a pas d'explication assez décente sur les documents Xcode, cela entre dans la théorie profonde sans exemples clairs, pas toujours, mais parfois. : P Ouais, je comprends la partie mutable (capable de muter) maintenant merci. :)
système
0

Pour référence, vous pouvez également utiliser initWithDictionarypour initier le NSMutableDictionaryavec un littéral:

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
Topher Fangio
la source