real rae para gratis espaƱola dle diccionario descargar app academico academia iphone objective-c dictionary nsdictionary key-value-coding

iphone - rae - dle



Acceso directo a los valores del diccionario anidado en Objective-C (3)

Al usar la respuesta correcta de Simon Whitaker, pude construir una jerarquía de constantes incorporando un Diccionario en un Diccionario en un Diccionario. A continuación se muestra un código fuente de ejemplo, modificado de mi código fuente real.

Esta es una solución de problema del mundo real. En mi caso particular, el objetivo era organizar las cadenas que identifican los productos a los que se accede a través de StoreKit para la compra desde la aplicación en la App Store de Apple para iOS. Imagina que nuestra aplicación presenta contenido de un par de libros, uno sobre gatos, los otros perros. Además, nuestra aplicación vende una versión abreviada del contenido, así como no completa. La actualización de la versión abreviada a la no terminada significa un tercer producto, "actualización". Cada par de libros puede ser traducido, en este caso inglés e italiano.

Al mirar las cuerdas que estoy tratando de rastrear, podrías pensar "¿Por qué ese tipo no usa las cuerdas por sí mismo en lugar de pasar por esta tontería KVC?". Bueno, note la segunda cadena, inglés> Gatos> Sin completar. La cadena termina con un guión bajo añadido. Esto se debe a que cuando utilicé iTunesConnect para crear los productos de compra en la aplicación, accidentalmente creé ese artículo como "Consumible" en lugar de "No consumible". Apple no permite cambiar la ID, incluso si elimina dicho producto. Así que la cadena original no pudo ser usada; alternativamente, agregué el guión bajo como una solución. Así que el punto es que estas cadenas son arbitrarias y desordenadas.

Otra necesidad similar para este enfoque sería si estos valores de cadena pudieran cambiar ocasionalmente en tiempo de compilación, por lo que no desea copiar y pegar en más de un lugar en su código fuente. Una jerarquía de constantes, en otras palabras.

Dentro de Xcode, quiero una mejor manera de referirme a estos identificadores de productos.

// Using new literals syntax in later versions of Xcode 4 (& 5) to declare and populate a dictionary nested in a dictionary also in a dictionary. NSDictionary *productIdentifiersHierarchy = @{ @"en" : @{ @"cats" : @{ @"abridged" : @"com.example.My_App.cats_abridged_en", @"unabridged" : @"com.example.My_App.cats_unabridged_en_", @"upgrade" : @"com.example.My_App.cats_upgrade_en" }, @"dogs" : @{ @"abridged" : @"com.example.My_App.dogs_abridged_en", @"unabridged" : @"com.example.My_App.dogs_unabridged_en", @"upgrade" : @"com.example.My_App.dogs_upgrade_en" } }, @"it" : @{ @"cats" : @{ @"abridged" : @"com.example.My_App.cats_abridged_it", @"unabridged" : @"com.example.My_App.cats_unabridged_it", @"upgrade" : @"com.example.My_App.cats_upgrade_it" }, @"dogs" : @{ @"abridged" : @"com.example.My_App.dogs_abridged_it", @"unabridged" : @"com.example.My_App.dogs_unabridged_it", @"upgrade" : @"com.example.My_App.dogs_upgrade_it" } } };

Aquí se explica cómo acceder a estos diccionarios de triple anidación.

// Use KVC (Key-Value Coding) as a convenient way to access the nested dictionary structure. NSLog( [productIdentifiersHierarchy valueForKeyPath:@"en.cats.abridged"], NSLog( [productIdentifiersHierarchy valueForKeyPath:@"en.cats.unabridged"], NSLog( [productIdentifiersHierarchy valueForKeyPath:@"en.cats.upgrade"], NSLog( [productIdentifiersHierarchy valueForKeyPath:@"en.dogs.abridged"], NSLog( [productIdentifiersHierarchy valueForKeyPath:@"en.dogs.unabridged"], NSLog( [productIdentifiersHierarchy valueForKeyPath:@"en.dogs.upgrade"], NSLog( [productIdentifiersHierarchy valueForKeyPath:@"it.cats.abridged"], NSLog( [productIdentifiersHierarchy valueForKeyPath:@"it.cats.unabridged"], NSLog( [productIdentifiersHierarchy valueForKeyPath:@"it.cats.upgrade"], NSLog( [productIdentifiersHierarchy valueForKeyPath:@"it.dogs.abridged"] ); NSLog( [productIdentifiersHierarchy valueForKeyPath:@"it.dogs.unabridged"] ); NSLog( [productIdentifiersHierarchy valueForKeyPath:@"it.dogs.upgrade"] );

¿Hay alguna manera de acceder directamente a una matriz interna de una matriz externa en Objective-C? Por ejemplo, una llamada a un origen de datos externo devuelve el siguiente objeto:

{ bio = "this is the profile.bio data"; "first_name" = John; "last_name" = Doe; location = { name = "Any Town, Any State"; }; metadata = { pictures = { picture = "https://picture.mysite.com/picture.jpeg"; } } }

Quiero poder acceder, por ejemplo, a la información de location.name o metadata.pictures.picture. La notación de puntos, sin embargo, no parece funcionar. Por ejemplo:

_gfbLocation = [result objectForKey:@"location.name"]; _gfbPicture = [result objectForKey:@"metadata.pictures.picture"];

La única forma en que he podido acceder a estos datos es estableciendo primero el contenido de las matrices internas en objetos. ¿Pensamientos?


Para claves anidadas como esa, puedes usar un keyPath . Un keyPath es solo una serie de claves unidas con puntos. Puede usarlos para recuperar valores anidados de objetos que admiten la codificación de clave-valor, incluidos objetos NSDictionary como el suyo. Así que en tu caso esto debería funcionar:

[result valueForKeyPath:@"location.name"];

Para obtener más detalles sobre la codificación de valor-clave, consulte la Guía de programación de codificación de valor-clave de Apple.

Vea también esta pregunta relacionada de .


gfbPicture = [[[result objectForKey:@"metadata"] objectForKey:@"pictures"] objectForKey:@"picture"];