Estoy jugando con el nuevo lenguaje de programación Swift de Apple y tengo algunos problemas ...
Actualmente estoy tratando de leer un archivo plist, en Objective-C haría lo siguiente para obtener el contenido como NSDictionary:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];
¿Cómo obtengo un plist como diccionario en Swift?
Supongo que puedo obtener el camino hacia la lista con:
let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist")
Cuando esto funciona (¿es correcto?): ¿Cómo obtengo el contenido como un diccionario?
También una pregunta más general:
¿Está bien usar las clases NS * predeterminadas ? Creo que sí ... ¿o me estoy perdiendo algo? Hasta donde yo sé, ¿las clases NS * de marco predeterminadas siguen siendo válidas y se pueden usar?
Respuestas:
En Swift 3.0 Lectura de Plist.
Leer más CÓMO UTILIZAR LISTAS DE PROPIEDADES (.PLIST) EN SWIFT .
fuente
Todavía puede usar NSDictionaries en Swift:
Para Swift 4
Para Swift 3+
Y versiones anteriores de Swift
Las NSClasses todavía están disponibles y son perfectas para usar en Swift. Creo que probablemente querrán cambiar el enfoque a rápido pronto, pero actualmente las API rápidas no tienen toda la funcionalidad de las NSClasses principales.
fuente
mainBundle()
es solomain
en Swift 3NSArray/NSDictionary
para leer datos de la lista de propiedades.PropertyListSerialization
(y en Swift 4, alternativamente, elCodable
protocolo) es la API apropiada. Proporciona un manejo moderno de errores y los datos se pueden convertir directamente a tipos de colección nativos de Swift.Esto es lo que hago si quiero convertir un .plist a un diccionario Swift:
Editado para Swift 2.0:
Editado para Swift 3.0:
fuente
NSArray/NSDictionary
para leer datos de la lista de propiedades.PropertyListSerialization
(y en Swift 4, alternativamente, elCodable
protocolo) es la API apropiada. Proporciona un manejo moderno de errores y los datos se pueden convertir directamente a tipos de colección nativos de Swift.Swift 4.0
Ahora puede usar el protocolo Decodable para decodificar un .plist en una estructura personalizada. Revisaré un ejemplo básico, para estructuras .plist más complicadas, recomiendo leer en Decodable / Encodable (un buen recurso está aquí: https://benscheirman.com/2017/06/swift-json/ ).
Primero configure su estructura en el formato de su archivo .plist. Para este ejemplo, consideraré un .plist con un Diccionario de nivel raíz y 3 entradas: 1 Cadena con la clave "nombre", 1 Int con la clave "age" y 1 Boolean con la clave "single". Aquí está la estructura:
Suficientemente simple. Ahora la parte genial. Usando la clase PropertyListDecoder podemos analizar fácilmente el archivo .plist en una instanciación de esta estructura:
No hay mucho más código de qué preocuparse, y todo está en Swift. Mejor aún, ahora tenemos una instanciación de la estructura de configuración que podemos usar fácilmente:
Esto imprime el valor de las teclas "nombre", "edad" y "simple" en la lista.
fuente
Bundle.main.url(forResource: "Config", withExtension: "plist")
y deshacerse de élURL(fileURLWithPath
? Y como se requiere que el archivo exista (en tiempo de diseño / compilación), todos los valores se pueden desenvolver a la fuerza. El código no debe bloquearse si todo está diseñado correctamente.url(forResource: "Config", withExtension: "plist")
, solo estaba haciendo coincidir lo que hizo el OP en su código como punto de comparación. En cuanto a la fuerza para desenvolver todo, trato de errar por el lado de la precaución. Creo que esa es una pregunta fundamental para Swift en general. Prefiero saber exactamente qué hará mi código en cualquier situación que el bloqueo.decoder.decode([Config].self, from: data)
. (Observe los corchetes alrededor de [Config])Esta respuesta usa objetos nativos Swift en lugar de NSDictionary.
Swift 3.0
fuente
He estado trabajando con Swift 3.0 y quería aportar una respuesta para la sintaxis actualizada. Además, y posiblemente lo más importante, estoy usando el objeto PropertyListSerialization para hacer el trabajo pesado, que es mucho más flexible que simplemente usar NSDictionary, ya que permite una matriz como el tipo raíz del plist.
A continuación se muestra una captura de pantalla de la lista que estoy usando. Es un poco complicado, para mostrar la potencia disponible, pero esto funcionará para cualquier combinación permitida de tipos de plist.
Como puede ver, estoy usando una matriz de String: diccionarios de cadenas para almacenar una lista de nombres de sitios web y su URL correspondiente.
Estoy usando el objeto PropertyListSerialization , como se mencionó anteriormente, para hacer el trabajo pesado por mí. Además, Swift 3.0 se ha vuelto más "Swifty", por lo que todos los nombres de objetos han perdido el prefijo "NS".
Después de que el código anterior se ejecute
plist
será de tipoArray<AnyObject>
, pero sabemos de qué tipo es realmente, por lo que podemos convertirlo en el tipo correcto:Y ahora podemos acceder a las diversas propiedades de nuestro Array of String: String Dictionaries de forma natural. Esperemos convertirlos en estructuras o clases reales fuertemente tipadas;)
fuente
Es mejor usar diccionarios y matrices nativos porque han sido optimizados para su uso con Swift. Dicho esto, puedes usar NS ... clases rápidamente y creo que esta situación lo garantiza. Así es como lo implementaría:
Hasta ahora (en mi opinión), esta es la forma más fácil y eficiente de acceder a un plist, pero en el futuro espero que Apple agregue más funcionalidades (como usar plist) en los diccionarios nativos.
fuente
Swift - Leer / Escribir plist y archivo de texto ...
fuente
Swift 2.0: Acceso a la lista de información
Tengo un diccionario llamado CoachMarksDictionary con un valor booleano en Info.Plist. Quiero acceder al valor bool y hacerlo realidad.
Escribiendo a Plist:
Desde una lista personalizada: - (Crear desde File-New-File-Resource-PropertyList. Se agregaron tres cadenas denominadas: DashBoard_New, DashBoard_Draft, DashBoard_Completed)
El método se puede llamar como
fuente
Convertido en una extensión de conveniencia a través de la respuesta de Nick:
uso:
Estaría dispuesto a apostar que también funcionaría para crear una extensión similar para las matrices
fuente
realmente puede hacerlo en 1 línea
fuente
Puede leer plist en SWIFT Language de esta manera:
Leer el valor del diccionario único:
Si desea obtener un diccionario multidimensional completo en plist:
Aquí está el plist:
fuente
Dado que esta respuesta no está aquí todavía, sólo quería señalar también se puede utilizar la propiedad infoDictionary para obtener la información plist como un diccionario,
Bundle.main.infoDictionary
.Aunque algo así
Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String)
puede ser más rápido si solo está interesado en un elemento específico en la lista de información.fuente
en mi caso creo una
NSDictionary
llamadaappSettings
y agrego todas las claves necesarias. Para este caso, la solución es:fuente
objectForInfoDictionaryKey
era exactamente lo que estaba buscando.Puede usar eso, creo una extensión simple para Dictionary en github https://github.com/DaRkD0G/LoadExtension
Y puedes usar eso para cargar
fuente
Aquí hay una versión un poco más corta, basada en la respuesta de @connor
fuente
Swift 3.0
La forma más fácil de hacer esto en mi opinión.
fuente
He creado un
Dictionary
inicializador simple que reemplazaNSDictionary(contentsOfFile: path)
. Solo quite elNS
.Puedes usarlo así:
fuente
Lista de Swift 4.0 iOS 11.2.6 analizada y código para analizarla, basada en https://stackoverflow.com/users/3647770/ashok-r respuesta anterior.
fuente
Paso 1 : forma simple y rápida de analizar plist en Swift 3+
Paso 2: cómo usar:
fuente
Aquí está la solución que encontré:
Configuré el tipo de
test
paraAnyObject
silenciar una advertencia sobre una inferencia inesperada que podría ocurrir.Además, debe hacerse en un método de clase.
Para acceder y guardar un valor específico de un tipo conocido:
fuente
Uso diccionarios rápidos pero los convierto a NSDictionaries en mi clase de administrador de archivos de la siguiente manera:
Esta parece la forma menos problemática de leer y escribir, pero dejemos que el resto de mi código se mantenga lo más rápido posible.
fuente
Plist es una enumeración Swift simple que hice para trabajar con listas de propiedades.
Más ejemplos:
Plist.swift
Plist en sí es bastante simple, aquí está su listado en caso de que lo refiera directamente.
fuente
Swift 3.0
si desea leer una "matriz bidimensional" de .plist, puede intentarlo así:
fuente
Sencilla estructura de archivo de acceso plist (Swift 2.0)
Uso:
fuente