2009-11-19 7 views
66

Estoy desarrollando una aplicación en la que deseo utilizar un NSDictionary. ¿Alguien puede enviarme un código de muestra explicando el procedimiento de cómo usar un NSDictionary para almacenar datos con un ejemplo perfecto?¿Cómo podemos almacenar en un NSDictionary? ¿Cuál es la diferencia entre NSDictionary y NSMutableDictionary?

+52

Se podría empezar por echar un vistazo a la documentación NSDictionary ... – stefanB

+7

los RTFMs cortesía de alguna manera parecen más cáustica que los explícitos. –

+1

@stefanB Para muchos programadores nuevos, la documentación oficial suele ser muy complicada y confusa, por lo que una vista básica de _x_ en SO ayuda. –

Respuesta

189

Los NSDictionary y NSMutableDictionary documentos son probablemente su mejor apuesta. Incluso tienen algunos buenos ejemplos de cómo hacer varias cosas, como ...

... creando un NSDictionary

NSArray *keys = [NSArray arrayWithObjects:@"key1", @"key2", nil]; 
NSArray *objects = [NSArray arrayWithObjects:@"value1", @"value2", nil]; 
NSDictionary *dictionary = [NSDictionary dictionaryWithObjects:objects 
                 forKeys:keys];

... iterar sobre ella

for (id key in dictionary) { 
    NSLog(@"key: %@, value: %@", key, [dictionary objectForKey:key]); 
}

... hacerlo mutable

NSMutableDictionary *mutableDict = [dictionary mutableCopy];

Nota: la versión histórica antes de 2010: [[Diccionario mutableCopy] autorelease]

... y alterarlo

[mutableDict setObject:@"value3" forKey:@"key3"];

... a continuación, almacenar en un archivo

[mutableDict writeToFile:@"path/to/file" atomically:YES];

... y léalo nuevamente aga en

NSMutableDictionary *anotherDict = [NSMutableDictionary dictionaryWithContentsOfFile:@"path/to/file"];

... leer un valor

NSString *x = [anotherDict objectForKey:@"key1"]; 

... comprobar si existe una clave

if ([anotherDict objectForKey:@"key999"] == nil) NSLog(@"that key is not there"); 

... miedo utilizar la sintaxis futurista

A partir de 2014 en realidad se puede simplemente escribir dict [@ "llave"] en lugar de [objectForKey dict: "clave" @]

+0

Lo siento, ese último comentario fue un poco sarcástico. Gracias por mencionarlo. – Tim

+0

No lo vi, ¡así que estás bien! :) – jtbandes

+0

Correcto ... Hubo una fuga –

32
NSDictionary *dict = [NSDictionary dictionaryWithObject: @"String" forKey: @"Test"]; 
NSMutableDictionary *anotherDict = [NSMutableDictionary dictionary]; 

[anotherDict setObject: dict forKey: "sub-dictionary-key"]; 
[anotherDict setObject: @"Another String" forKey: @"another test"]; 

NSLog(@"Dictionary: %@, Mutable Dictionary: %@", dict, anotherDict); 

// now we can save these to a file 
NSString *savePath = [@"~/Documents/Saved.data" stringByExpandingTildeInPath]; 
[anotherDict writeToFile: savePath atomically: YES]; 

//and restore them 
NSMutableDictionary *restored = [NSDictionary dictionaryWithContentsOfFile: savePath]; 
+0

Buena explicación. Fue útil ... –

+0

@Ben Gottlieb Primera parte: Gracias por buenas explicaciones. De hecho, quiero guardar dos de mis datos de UItextField en un archivo de MutableDictionary. Aquí escribió 'NSString * savePath = [@" ~/Documents/Saved.data "stringByExpandingTildeInPath];', ahora mi pregunta es, ¿qué es el archivo 'Saved.data' aquí? ¿Cómo puedo hacerlo? – Tulon

+0

@Ben Gottlieb Parte dos: Y en mi caso puse un archivo de texto (.rtf) en el siguiente directorio 'Archivos de soporte> Archivos de medios> Documentos> userData.rtf'. Ahora puedo guardar este tipo de datos de Mutabledictionary en el archivo de texto ? ¿Y cuál será el directorio perfecto en este caso? Estaba intentando con esto '[userData writeToFile: @" MediaFiles/Documents/userData.rtf "atómicamente: SÍ];' & con esto '[userData writeToFile: @" Documents/userData.rtf "atómicamente: SÍ];', pero no funcionó Ten un buen día. – Tulon

18

La diferencia clave: NSMutableDictionary puede ser modificado en su lugar, NSDictionary no puede. Esto es cierto para todas las otras clases NSMutable * en Cocoa. NSMutableDictionary es una subclase de NSDictionary, por lo que todo lo que puede hacer con NSDictionary puede hacerlo con ambas. Sin embargo, NSMutableDictionary también agrega métodos complementarios para modificar las cosas en su lugar, como el método setObject:forKey:.

Puede convertir entre los dos así:

NSMutableDictionary *mutable = [[dict mutableCopy] autorelease]; 
NSDictionary *dict = [[mutable copy] autorelease]; 

Es de suponer que desea almacenar datos mediante solicitud dirigida a un archivo.NSDictionary tiene un método para hacer esto (que también trabaja con NSMutableDictionary):

BOOL success = [dict writeToFile:@"/file/path" atomically:YES]; 

Para leer un diccionario de un archivo, hay un método correspondiente:

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:@"/file/path"]; 

Si desea leer el archivo un NSMutableDictionary, simplemente use:

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:@"/file/path"]; 
+0

Gracias por la respuesta ... –