objective c - objective - Inicializando NSDictionary
nsdictionary to object swift (3)
Lo siguiente está en mi archivo .h:
NSDictionary *originalValues;
@property (nonatomic, retain) NSDictionary *originalValues;
Este es el archivo .m para iniciar el NSDictionary.
@synthesize originalValues;
- (void)viewDidLoad {
// copy original values when view loaded
originalValues = [[NSDictionary alloc] initWithObjectsAndKeys:place.city, @"city", place.cuisine, @"cuisine",
place.latitude, @"latitude", place.longitude, @"longitude", place.name, @"name", place.rating,
@"rating", place.state, @"state", place.street, @"street", place.telephone, @"telephone",
place.timesVisited, @"times visited", place.uppercaseFirstLetterOfName, @"first letter",
place.website, @"website", place.zipcode, @"zipcode", nil];
}
El problema es que solo se agregan los primeros cuatro objetos y las claves. Después de eso, no se agregarán al diccionario a partir de place.name, @ "name". Hice un NSLog en todo el diccionario y las únicas cosas que se obtuvieron fueron los primeros cuatro valores, como mencioné, entonces hice un NSLog en place.name y está generando un valor, así que sé que también se debe enviar algo para esta clave / valor par. ¿Hay algo que me estoy perdiendo aquí? Tengo curiosidad ¿por qué no se están agregando inicialmente todos los valores al NSDictionary?
La razón por la que no se agregan es porque un objeto es nulo, lo que marca el final del diccionario. [NSNull null]
asegurarse de que cada objeto no sea nil
y, si lo está, puede usar [NSNull null]
en lugar de él. También use self.originalValues = ...
para una correcta gestión de la memoria. Solo asegúrese de que alguna vez use las comprobaciones del diccionario / pueda manejar los valores NSNull
.
Ejemplo usando la gnu ternary extension
:
self.originalValues = [[NSDictionary alloc] initWithObjectsAndKeys:
place.city ?: [NSNull null], @"city",
place.cuisine ?: [NSNull null], @"cuisine",
place.latitude ?: [NSNull null], @"latitude",
place.longitude ?: [NSNull null], @"longitude",
place.name ?: [NSNull null], @"name",
place.rating ?: [NSNull null], @"rating",
place.state ?: [NSNull null], @"state",
place.street ?: [NSNull null], @"street",
place.telephone ?: [NSNull null], @"telephone",
place.timesVisited ?: [NSNull null], @"times visited",
place.uppercaseFirstLetterOfName ?: [NSNull null], @"first letter",
place.website ?: [NSNull null], @"website",
place.zipcode ?: [NSNull null], @"zipcode",
nil];
Para evitar nulos accidentales en cualquier diccionario, la mejor solución sería si combina las dos técnicas utilizando el operador literal y ternario.
self.originalValues = @{ @"city" : (place.city ?: @"city"),
@"latitude" : (place.latitude ?: [NSNull null]),
// etc.
};
Nota:
(anyValueOrVariable?: @ "anyOtherValueOrVariable")
Es una abreviatura y significa lo mismo que
(anyValueOrVariable! = 0)? anyValueOrVariable: @ "anyOtherValueOrVariable"
Si uno de los objetos es nil
, puede capturarlo mucho más rápido si usa la nueva sintaxis literal para inicializar un NSDictionary
(a continuación). Esta sintaxis no solo es más corta, sino también más robusta: en realidad obtendrá un error de tiempo de ejecución si uno de sus objetos es nil
, en lugar de continuar en silencio con los datos incompletos.
originalValues = @{ @"city" : place.city,
@"latitude" : place.latitude,
// etc.
};