Cómo agregar a un NSDictionary

93

Estaba usando un NSMutableArrayy me di cuenta de que usar un diccionario es mucho más simple para lo que estoy tratando de lograr.

Quiero guardar una clave como NSStringun valor y un valor inten el diccionario. ¿Cómo se hace esto? En segundo lugar, ¿cuál es la diferencia entre un diccionario mutable y un diccionario normal?

sistema
fuente

Respuestas:

199

Se puede cambiar un diccionario mutable , es decir, se pueden agregar y eliminar objetos. Un inmutable se fija una vez que se crea.

crear y agregar:

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

y recuperar:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];
Eiko
fuente
¿Tiene que iniciar con una capacidad, o puede ser dinámico?
muttley91
2
No es necesario que especifique la capacidad inicial, pero es posible que observe mejoras en el rendimiento si lo hace. Si sabe de antemano cuántos elementos contendrá, proporcione este número o un valor ligeramente mayor.
Eiko
pidiendo NSDictionary no NSMutableDictionary?
Ananta Prasad
35

Al configurar, usarías el setValue:(id)value forKey:(id)keymétodo de NSMutableDictionaryobjeto:

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

O en el moderno Objective-C:

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

La diferencia entre mutable y "normal" es, bueno, mutabilidad. Es decir, puede modificar el contenido de NSMutableDictionary(y NSMutableArray) mientras que no puede hacerlo con "normal" NSDictionaryyNSArray

Eimantas
fuente
2
¿No debería envolver ese entero en un NSNumber?
Johan Kool
Tengo un problema más con esto. Necesito almacenar un texto ingresado por el usuario como una cadena, así como la referencia de la imagen (el índice en la matriz de imágenes) en la que el usuario está guardando el texto. Probé un mutableArray de objetos que tienen 2 variables, una para cada que acabo de mencionar. eso no funcionaba bien al intentar rellenar tableView con los valores de texto de los objetos de matriz. Entonces pensé en un diccionario, el único problema es que no parece que pueda recuperar datos por índice, tiene que ser una clave o un valor como un mapa de hash, ¿verdad?
sistema
@Johan - ¡correcto y actualizado! @alJaree: sí, el diccionario es una especie de almacén de valores clave. Creo que en tu posición estarías mejor con una variedad de diccionarios. Algo como[{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
Esto todavía no funcionará para mí, porque necesito recuperar texto de cada objeto y usarlo para completar el UITableView de favoritos, así como también necesito una referencia de índice a la matriz de imágenes para poder recuperar y mostrar la imagen favorita seleccionada. Probé el objeto que describí anteriormente, pero los objetos devueltos al leer de la matriz donde NSStrings por alguna razón en lugar del objeto específico que se almacenó. No estoy seguro de qué hacer aquí,
sistema
Estoy pensando que podría necesitar almacenar NSStrings como @ "% d _% @, index, SavedTitle y luego dividir NSString y tomar y enviar lo que necesito. Estoy pensando en términos de Java, seguro que debe haber un función dividida en obj c. :)
sistema
16

Cuando alguna vez se declara la matriz, solo tenemos que agregar los valores-clave en NSDictionary como

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

no podemos agregar o eliminar los valores clave en este NSDictionary

Donde, como en NSMutableDictionary, podemos agregar los objetos después de la inicialización de la matriz también usando este método

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

para eliminar el valor clave tenemos que usar el siguiente código

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

Versión actualizada

C objetivo

Crear:

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

Cambio:

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

La sintaxis abreviada se llama Objective-C Literals.

Rápido

Crear:

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

Cambio:

dictionary["myKey3"] = 3
Warif Akhand Rishi
fuente
1

Lo que quiere preguntar es "cuál es la diferencia entre una matriz o diccionario mutable y no mutable". Muchas veces se utilizan diferentes términos para describir cosas que ya conoce. En este caso, puede reemplazar el término "mutable" por "dinámico". Por lo tanto, un diccionario o matriz intercambiable es uno que es "dinámico" y puede cambiar en tiempo de ejecución, mientras que un diccionario o matriz no mutable es uno que es "estático" y está definido en su código y no cambia en tiempo de ejecución (en otras palabras , no agregará, eliminará ni posiblemente clasificará los elementos).

En cuanto a cómo se hace, nos solicita que repitamos aquí la documentación. Todo lo que necesita hacer es buscar en el código de muestra y la documentación de Xcode para ver exactamente cómo se hace. Pero la cosa mutable también me sorprendió cuando estaba aprendiendo por primera vez, ¡así que te daré esa!

Mark Hernandez
fuente
A veces no hay una explicación lo suficientemente decente sobre los documentos de Xcode, se adentra en la teoría profunda sin ejemplos claros, no siempre, pero a veces. : P Sí, entiendo la parte mutable (capaz de mutar) ahora gracias. :)
sistema
0

Como referencia, también puede utilizar initWithDictionarypara iniciar NSMutableDictionarycon uno literal:

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