Una cuestión importante sobre NSDictionaries
-
29-09-2019 - |
Pregunta
Tengo una NSDictionary con NSStrings
Algunos de los valueForKey: @ "clave" no tienen entrada por lo que es (null)
NSMutableString* addressDictionaryToString = [NSMutableString string]; // use mutable string!
for (NSDictionary* item in address) { // use fast enumeration!
[addressDictionaryToString appendFormat:@"%@, %@, %@, %@",
[item objectForKey:@"Street"],
[item objectForKey:@"City"],
[item objectForKey:@"State"],
[item objectForKey:@"ZIP"]
];
NSLog(@"MutableString: %@", addressDictionaryToString);
}
Así que quieren construir un filtro de NSMutableString pero esas llaves que son nulas. Algunas ideas?
ACTUALIZACIÓN :::::
Básicamente quiero que mi cadena resultante para que parezca
1 Infinite Loop, Cupertino, CA, 95014 (si todos los campos están disponibles)
Si Im perdiendo la calle después
Cupertino, CA, 95014
Si me falta el Estado después
1 Infinite Loop, Cupertino, 95014
Si sólo tengo el estado entonces se debe imprimir
CA
(nótese que no hay comas en el último elemento)
Solución
¿Qué hay de comprobar si hay un valor de la clave?
NSMutableString * addressDictionaryToString = [NSMutableString string];
for (NSDictionary * item in address)
{
if ([item objectForKey:@"Street"])
[addressDictionaryToString appendFormat:@"%@, ",
[item objectForKey:@"Street"]];
if ([item objectForKey:@"City"])
[addressDictionaryToString appendFormat:@"%@, ",
[item objectForKey:@"City"]];
if ([item objectForKey:@"State"])
[addressDictionaryToString appendFormat:@"%@, ",
[item objectForKey:@"State"]];
if ([item objectForKey:@"ZIP"])
[addressDictionaryToString appendFormat:@"%@, ",
[item objectForKey:@"ZIP"]];
NSLog(@"MutableString: %@", addressDictionaryToString);
}
La cosa es, en su última pregunta, dijo que su objetivo era crear un archivo CSV. No es CSV técnicamente válida si sus filas tienen diferentes números de campos y no hay forma fiable para identificar a cada uno.
En lugar de ello, es posible que intente lo siguiente:
NSMutableString * addressDictionaryToString = [NSMutableString string];
for (NSDictionary * item in address)
{
[addressDictionaryToString appendFormat:@"%@,",
([item objectForKey:@"Street"]) ? [item objectForKey:@"Street"] : @"" ];
// ...
NSLog(@"MutableString: %@", addressDictionaryToString);
}
comprueba la presencia de un valor y se inserta ese valor si hay uno, o simplemente una cadena vacía (que resulta en "valor, valor ,, valor ..."). Asimismo, recuerda que no debería haber un espacio después de la coma, por lo que me he quitado de este ejemplo.
Otros consejos
No exactamente seguro de lo que estamos tratando de hacer que esto:
NSDictionary *d=[NSDictionary dictionaryWithObject:[NSNull null] forKey:@"ns"];
NSString *n=[@"Steve " stringByAppendingFormat:@"%@",[d objectForKey:@"ns"]];
NSLog(@"%@",n);
... impresiones:
Steve <null>
Si la clave no existe, entonces se producirá una excepción cuando se trata de obtener el valor de la clave inexistente. El único recurso que en este caso es para comprobar si la clave en cada diccionario antes de intentar utilizarlo para recuperar un valor.