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