-Descargo de responsabilidad-

Soy muy nuevo en iOS y rápido desarrollo, pero no estoy particularmente nuevo en la programación.

Tengo un básico iOS aplicación con Swift3 elementos en ella.
He creado un plist archivo con algunas entradas quiero leer y mostrar en mi aplicación. (No hay acceso de escritura es necesario)

¿Cómo se puede leer un valor para una clave dada por un paquete de plist archivo, en Swift3?

Esto parece una muy simple pregunta a mí, pero un montón de búsqueda es lo que me pregunta todo mi enfoque conceptual.

Consejos útiles se agradece.

  • ver este rebeloper.com/read-write-plist-file-swift y este learncoredata.com/plist
  • El rebeloper sitio se señaló anteriormente, es un enlace a una biblioteca para manejar estas cosas. Podría ser genial, no sé, pero es sin duda un largo artículo en el que describe un proceso que es mucho más complicado de lo que este proceso debe exigir. El segundo sitio es un enlace muerto para mí en este día.

7 Comentarios

  1. 70

    Misma forma que lo hemos hecho en Swift 2.3 o inferior sólo la sintaxis es cambiado.

    if let path = Bundle.main.path(forResource: "fileName", ofType: "plist") {
    
        //If your plist contain root as Array
        if let array = NSArray(contentsOfFile: path) as? [[String: Any]] {
    
        }
    
        ////If your plist contain root as Dictionary
        if let dic = NSDictionary(contentsOfFile: path) as? [String: Any] {
    
        }
    }

    Nota: En Swift es mejor utilizar Swift genérico del tipo de Matriz y Diccionario en lugar de NSArray y NSDictionary.

    Edición: en Lugar de NSArray(contentsOfFile: path) y NSDictionary(contentsOfFile:) también podemos utilizar PropertyListSerialization.propertyList(de:) para leer los datos de plist archivo.

    if let fileUrl = Bundle.main.url(forResource: "fileName", withExtension: "plist"),
       let data = try? Data(contentsOf: fileUrl) {
           if let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [[String: Any]] { //[String: Any] which ever it is 
                print(result)
           }
    }
    • Muchas gracias. He encontrado un montón de ejemplos para Swift != 3. Estoy preocupado acerca de la adopción de Swift como también he oído que había dos bastante importantes redecorations en su corta vida.
    • Vale la pena señalar que algunos plists están pre-definidos. Más notablemente, la info.plist : static let BASE_URL = Bundle.main.infoDictionary!["MY_BASE_URL"] as! String
    • A destacar el muy buen punto por @Dilapidus, la correcta/aceptado la respuesta a esta pregunta debe estar basada en Bundle.main.infoDictionary … es esperándote. No hay necesidad de más código.
    • Gracias por el código.
  2. 9

    Como Swift 4 introduce Codable

    Paso 1: Cargar el Archivo Plist de paquete.

    Paso 2: Utilice PropertyListDecoder para la decodificación de la propiedad de lista de valores en la semántica Decodable tipos.

    Paso 3: Crear Codable Struct

    Código completo –

     func setData() {
    //location of plist file
            if let settingsURL = Bundle.main.path(forResource: "JsonPlist", ofType: "plist") {
    do {
    var settings: MySettings?
    let data = try Data(contentsOf: URL(fileURLWithPath: settingsURL))
    let decoder = PropertyListDecoder()
    settings = try decoder.decode(MySettings.self, from: data)
    print("toolString is \(settings?.toolString ?? "")")
    print("DeviceDictionary is \(settings?.deviceDictionary?.phone ?? "")")
    print("RootPartArray is \(settings?.RootPartArray ?? [""])")
    } catch {
    print(error)
    }
    }
    }
    }
    struct MySettings: Codable {
    var toolString: String?
    var deviceDictionary: DeviceDictionary?
    var RootPartArray: [String]?
    private enum CodingKeys: String, CodingKey {
    case toolString = "ToolString"
    case deviceDictionary = "DeviceDictionary"
    case RootPartArray
    }
    struct DeviceDictionary: Codable {
    var phone: String?
    init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    phone = try values.decodeIfPresent(String.self, forKey: .phone)
    }
    }
    init(from decoder: Decoder) throws {
    let values = try decoder.container(keyedBy: CodingKeys.self)
    toolString = try values.decodeIfPresent(String.self, forKey: .toolString)
    deviceDictionary = try values.decodeIfPresent(DeviceDictionary.self, forKey: .deviceDictionary)
    RootPartArray = try values.decodeIfPresent([String].self, forKey: .RootPartArray)
    }
    }

    Muestra Plist archivo -> https://gist.github.com/janeshsutharios/4b0fb0e3edeff961d3e1f2829eb518db

    • Creo Que tiene un mejor rendimiento cuando se la considera con el ahorro para NSDictionary o Diccionario de derecho?
    • Codable es óptima por parte de Apple
  3. 2

    Aquí es un Swift 3 aplicación, con base en Nirav D respuesta:

        ///Read Plist File.
        ///
        ///- Parameter fileURL: file URL.
        ///- Returns: return plist content.
        func ReadPlist(_ fileURL: URL) -> [String: Any]? {
    guard fileURL.pathExtension == FileExtension.plist, let data = try? Data(contentsOf: fileURL) else {
    return nil
    }
    guard let result = try? PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [String: Any] else {
    return nil
    }
    print(result)
    return result
    }
    • Gracias por la nueva propuesta. Por favor, ¿puedes caminar a través de mí ¿cómo esto es diferente de Nirav D la respuesta? Me gusta que tiene manejo de excepciones involucrados. Es que básicamente es?
    • Gracias por su pregunta. Las dos respuestas son básicamente los mismos.Acabo de abstrae su respuesta como una función para llamar fácilmente. Nirav D la respuesta no manejar la excepción o algo malo. Así que en mi función, si algunas cosas malas que pasó se devuelve nil. La esperanza en busca de ayuda.
  4. 2

    Aquí es ejemplo de cómo obtener BundleID de Información plist:

    var appBundleID = "Unknown Bundle ID"    
    if let bundleDict = Bundle.main.infoDictionary, 
    let bundleID = bundleDict[kCFBundleIdentifierKey as String] as? String {
    appBundleID = bundleID
    }

    De la misma manera que usted puede tener acceso fácilmente a cualquier tecla. Este enfoque es bueno para muchos-objetivo de los proyectos.

  5. 0

    Para Swift 3.0 Siguiente código de dirigirse directamente a la clave. Donde como dict objeto de dar todo lo que va a estar allí en su archivo plist.

    if let path = Bundle.main.path(forResource: "YourPlistFile", ofType: "plist"), let dict = NSDictionary(contentsOfFile: path) as? [String: AnyObject] {
    let value = dict["KeyInYourPlistFile"] as! String
    }
  6. 0

    En El AppDelegate Archivo

    var bundlePath:String!
    var documentPath:String!
    var plistDocumentPath:URL!
    let fileManager = FileManager()
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
    {
    bundlePath = Bundle.main.path(forResource: "Team", ofType: "plist")
    documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
    plistDocumentPath = URL.init(string: documentPath)?.appendingPathComponent("Team.plist")
    print(plistDocumentPath.path)
    if !fileManager.fileExists(atPath: plistDocumentPath.path){
    do {
    try fileManager.copyItem(atPath: bundlePath, toPath: plistDocumentPath.path)
    } catch  {
    print("error Occured \(error.localizedDescription)")
    }
    }
    return true
    }

    En ViewController

     @IBOutlet weak var TeamTable: UITableView!
    var appDelegate:AppDelegate!
    var arrayForContacts:[[String:Any]]! //array object
    
    override func viewDidLoad() {
    super.viewDidLoad()
    appDelegate = UIApplication.shared.delegate as! AppDelegate
    }
    override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    if appDelegate.fileManager.fileExists(atPath: appDelegate.plistDocumentPath.path){
    arrayForContacts = []
    if let contentOfPlist = NSArray.init(contentsOfFile: appDelegate.plistDocumentPath.path ){
    arrayForContacts = contentOfPlist as! [[String:Any]]
    TeamTable.reloadData()
    }
    }
    }
  7. 0

    También puede leer el valor directamente desde el archivo plist simplemente

    let value = Bundle.init(for: AppDelegate.self).infoDictionary?["your plist key name"] as? Any

Dejar respuesta

Please enter your comment!
Please enter your name here