iphone objective-c nsdictionary nsmutabledictionary

iphone - ¿Cómo podemos almacenar en un NSDictionary? ¿Cuál es la diferencia entre NSDictionary y NSMutableDictionary?



objective-c (3)

Estoy desarrollando una aplicación en la que quiero utilizar un NSDictionary . ¿Puede alguien enviarme un código de muestra explicando el procedimiento de cómo usar un NSDictionary para almacenar datos con un ejemplo perfecto?


La diferencia clave: NSMutableDictionary se puede modificar en su lugar, NSDictionary no . 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 hacer con ambos. 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 de esta manera:

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

Presumiblemente, desea almacenar datos escribiéndolos en un archivo. NSDictionary tiene un método para hacer esto (que también funciona 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 quiere leer el archivo como NSMutableDictionary, simplemente use:

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


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

... crea 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 eso

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

... hacerlo mutable

NSMutableDictionary *mutableDict = [dictionary mutableCopy];

Nota: versión histórica anterior a 2010: liberación automática de [[dictionary mutableCopy]]

... y modificarlo

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

... luego almacenarlo en un archivo

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

... y leerlo de nuevo

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

... leer un valor

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

... verificar si existe una clave

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

... usa una sintaxis futurista aterradora

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


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];