Skip to content

Instantly share code, notes, and snippets.

@runys
Last active June 7, 2021 07:39
Show Gist options
  • Save runys/8a1a05f42d25a66b140a37e08c21b0fb to your computer and use it in GitHub Desktop.
Save runys/8a1a05f42d25a66b140a37e08c21b0fb to your computer and use it in GitHub Desktop.
How to read Property Lists in iOS 10 with Swift 3
/*
O que é um Property List (PList)?
- Ref: [Apple: About Info.plist](https://developer.apple.com/library/content/documentation/General/Reference/InfoPlistKeyReference/Articles/AboutInformationPropertyListFiles.html)
- Ref: [Apple: Introduction to Property Lists](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/PropertyLists/Introduction/Introduction.html)
- Ref: [](https://makeapppie.com/2016/02/11/how-to-use-property-lists-plist-in-swift/)
É um tipo de arquivo que pode armazenar informações de maneira estruturada.
Um plist é um arquivo que utiliza um notação XML para organizar a informação.
Os tipos de informação podemos armazenar são:
- Array <array>...</array>
- Dicionário <dict> <key></key> ... </dict>
- String <string></string>
- Data <data></data>
- Date <date></date>
- Inteiros <int></int>
- Double <real></real>
- Bool <true/> ou <false/>
Para criar o seu property list basta criar um novo arquivo plist (cmd + N) e editá-lo.
Agora vamos ver como fazemos para:
- Abrir um arquivo plist
- Pegar informação armazenada no plist
*/
// Criamos a classe PListManager para ser responsável por ler Property Lists e retornar para nós
// as informações armazendas nele.
class PListManager {
/**
Método que retorna, se possível, um dicionário com as informações armazenadas na property list.
Se o root do property list não for um dicionário, ele retorna um dicionário vazio.
*/
static func readDictionaryPropertyList(named fileName: String) -> [String: AnyObject] {
// Primeira coisa, definimos o formato do property list.
// Vamos trabalhar com XML inicialmente, mas esse formato pode ser alterado pelo método de serialização
var format = PropertyListSerialization.PropertyListFormat.xml
// A propriedade que irá armazenar o dicionário na property list
var plistData = [String:AnyObject]()
// Aqui defenimos o caminho do arquivo que vamos abrir.
// Bundle representa o app em si e vai ser responsável por trazer o endereço do arquivo dentro do app, para que possamos lê-lo
let plistPath: String? = Bundle.main.path(forResource: fileName, ofType: "plist")!
// Nós usamos o FileManager para pegar o conteúdo do nosso arquivo PList
// Esse conteúdo vem pra gente no formato de Data
let plistXML = FileManager.default.contents(atPath: plistPath!)!
// O próximo passo é serializar nosso Data para um dicionário propriamente dito utilizando PropertyListSerialization. Porém pode ser que erros de sintaxe ou erros de outros tipos impeçam nossa serialização de dar certo.
// Por isso temos que fazer a serialização em um bloco try-catch, pois a serialização lança exeções quando esses problemas acontecem.
do {
// Aqui serializamos nosso plistXML (Data) para um dicionário [String: AnyObject] e armazenamos o resultado no nosso plistData
plistData = try PropertyListSerialization.propertyList(from: plistXML, options: .mutableContainersAndLeaves, format: &format) as! [String: AnyObject]
} catch let error {
print("Error reading plist: \(error) format: \(format)")
}
// Por fim retornamos o dicionário proveniente da nossa serialização.
// Caso algo de errado, retornamos um dicionário vazio.
return plistData
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment