Come aggiungere a un NSDictionary


91

Stavo usando a NSMutableArraye ho capito che usare un dizionario è molto più semplice per quello che sto cercando di ottenere.

Voglio salvare una chiave come NSStringe un valore come intnel dizionario. Come si fa? In secondo luogo, qual è la differenza tra mutabile e un dizionario normale?

Risposte:


197

Un mutevole dizionario può essere cambiato, cioè è possibile aggiungere e rimuovere oggetti. Un immutabile viene corretto una volta creato.

creare e aggiungere:

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

e recupera:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];

Devi iniziare con una capacità o può essere solo dinamico?
muttley91

2
Non è necessario specificare la capacità iniziale, ma se lo fai potresti vedere miglioramenti delle prestazioni. Se sai in anticipo quanti elementi conterrà, fornisci questo numero o un valore leggermente superiore.
Eiko

chiedendo NSDictionary non NSMutableDictionary?
Ananta Prasad

34

Impostando useresti il setValue:(id)value forKey:(id)keymetodo NSMutableDictionarydell'oggetto:

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

O nel moderno Objective-C:

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

La differenza tra mutevole e "normale" è, beh, mutevole. Cioè puoi modificare il contenuto di NSMutableDictionary(e NSMutableArray) mentre non puoi farlo con "normale" NSDictionaryeNSArray


2
Non dovresti racchiudere quel numero intero in un NSNumber?
Johan Kool

Ho un altro problema con questo. Ho bisogno di memorizzare un testo inserito dall'utente come stringa così come il riferimento dell'immagine (l'indice nella matrice di immagini) in cui l'utente sta salvando il testo. Ho provato un mutableArray di oggetti che hanno 2 variabili, una per ciascuna che ho appena menzionato. che non funzionava bene quando si cercava di popolare il tableView con i valori di testo degli oggetti array. Quindi ho pensato a un dizionario, l'unico problema è che non sembra che potessi recuperare i dati per indice, deve essere una chiave o un valore come una hashmap, giusto?
sistema

@ Johan - corretto e aggiornato! @alJaree - sì, il dizionario è una specie di archivio di valori-chiave. Penso che nella tua posizione staresti meglio con una serie di dizionari. Qualcosa come[{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

Questo ancora non funzionerà per me, perché ho bisogno di recuperare il testo da ogni oggetto e usarlo per riempire i preferiti UITableView così come ho bisogno di un riferimento di indice all'array di immagini in modo da poter recuperare e visualizzare l'immagine preferita selezionata. Ho provato l'oggetto che ho descritto sopra, ma gli oggetti restituiti durante la lettura dall'array dove NSStrings per qualche motivo piuttosto che l'oggetto specifico che è stato memorizzato. Non sono sicuro di cosa fare qui,
sistema

Sto pensando che potrei aver bisogno di memorizzare solo NSStrings come @ "% d _% @, index, savedTitle e poi dividere NSString e prendere e versare quello che mi serve. Sto pensando in termini java, sicuramente ci deve essere un funzione split in obj c. :)
sistema

16

Ogni volta che viene dichiarato l'array, solo noi dobbiamo aggiungere il valore-chiave in NSDictionary come

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

non possiamo aggiungere o rimuovere i valori chiave in questo NSDictionary

Dove come in NSMutableDictionary possiamo aggiungere gli oggetti dopo l'inizializzazione dell'array anche usando questo metodo

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

per rimuovere il valore della chiave dobbiamo usare il seguente codice

[mutableDict removeObject:@"Value1" forKey:@"Key1"];

12

Versione aggiornata

Obiettivo-C

Creare:

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

Modificare:

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

Viene chiamata la sintassi della mano corta Objective-C Literals.

Swift

Creare:

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

Modificare:

dictionary["myKey3"] = 3

1

Quello che vuoi chiedere è "qual è la differenza tra un array o dizionario mutabile e non mutabile". Molte volte vengono usati termini diversi per descrivere cose che già conosci. In questo caso, puoi sostituire il termine "modificabile" con "dinamico". Quindi, un dizionario o array modificabile è uno che è "dinamico" e può cambiare in fase di esecuzione, mentre un dizionario o array non modificabile è uno che è "statico" e definito nel codice e non cambia in fase di esecuzione (in altre parole , non aggiungerai, eliminerai o eventualmente ordinerai gli elementi.)

Per quanto riguarda come è fatto, ci stai chiedendo di ripetere la documentazione qui. Tutto quello che devi fare è cercare nel codice di esempio e nella documentazione di Xcode per vedere esattamente come è fatto. Ma la cosa mutevole ha gettato anche me quando stavo imparando per la prima volta, quindi ti darò quella!


A volte non c'è una spiegazione abbastanza decente sui documenti di Xcode, si entra nella teoria profonda senza esempi chiari, non sempre, ma a volte. : P Sì, capisco la parte mutevole (in grado di mutare) ora grazie. :)
sistema

0

Per riferimento, puoi anche utilizzare initWithDictionaryper inizializzare NSMutableDictionarycon uno letterale:

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.