Estou brincando com o novo Swift da Apple linguagem de programação e tenho alguns problemas ...
Atualmente, estou tentando ler um arquivo plist, no Objective-C, faria o seguinte para obter o conteúdo como um NSDictionary:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];
Como obtenho um plist como um dicionário no Swift?
Suponho que posso obter o caminho para o plist com:
let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist")
Quando isso funciona (se estiver correto?): Como obtenho o conteúdo como um dicionário?
Também uma pergunta mais geral:
É possível usar as classes NS * padrão ? Acho que sim ... ou estou perdendo alguma coisa? Até onde eu sei, as classes NS * da estrutura padrão ainda são válidas e adequadas para uso?
Respostas:
Na rápida leitura de Plist 3.0 .
Leia mais COMO USAR LISTAS DE PROPRIEDADE (.PLIST) NO SWIFT .
fonte
Você ainda pode usar o NSDictionaries no Swift:
Para Swift 4
Para Swift 3+
E versões anteriores do Swift
As NSClasses ainda estão disponíveis e são perfeitas para usar no Swift. Eu acho que eles provavelmente vão querer mudar o foco rapidamente, mas atualmente as APIs rápidas não têm toda a funcionalidade do NSClasses principal.
fonte
mainBundle()
está apenasmain
no Swift 3NSArray/NSDictionary
nada para ler os dados da lista de propriedades.PropertyListSerialization
(e no Swift 4, alternativamente, oCodable
protocolo) é a API apropriada. Ele fornece tratamento moderno de erros e os dados podem ser convertidos diretamente em tipos de coleta Swift nativos.É o que eu faço se quiser converter um .plist em um dicionário Swift:
Editado para Swift 2.0:
Editado para Swift 3.0:
fonte
NSArray/NSDictionary
nada para ler os dados da lista de propriedades.PropertyListSerialization
(e no Swift 4, alternativamente, oCodable
protocolo) é a API apropriada. Ele fornece tratamento moderno de erros e os dados podem ser convertidos diretamente em tipos de coleta Swift nativos.Swift 4.0
Agora você pode usar o protocolo Decodable para decodificar um .plist em uma estrutura personalizada. Vou abordar um exemplo básico, para estruturas .plist mais complicadas, recomendo a leitura de Decodable / Encodable (um bom recurso está aqui: https://benscheirman.com/2017/06/swift-json/ ).
Primeiro, configure sua estrutura no formato do seu arquivo .plist. Neste exemplo, considerarei um .plist com um dicionário de nível raiz e 3 entradas: 1 String com a chave "name", 1 Int com a chave "age" e 1 Boolean com a chave "single". Aqui está a estrutura:
Simples o suficiente. Agora a parte legal. Usando a classe PropertyListDecoder, podemos facilmente analisar o arquivo .plist em uma instanciação dessa estrutura:
Não há muito mais código para se preocupar, e tudo está no Swift. Melhor ainda, agora temos uma instanciação da estrutura Config que podemos usar facilmente:
Isso imprime o valor para as chaves "nome", "idade" e "única" no .plist.
fonte
Bundle.main.url(forResource: "Config", withExtension: "plist")
e se livrarURL(fileURLWithPath
? E, como é necessário que o arquivo exista (no tempo de design / compilação), todos os valores podem ser forçados a serem desembrulhados. O código não deve falhar se tudo for projetado corretamente.url(forResource: "Config", withExtension: "plist")
eu estava apenas combinando o que o OP fez no código deles como um ponto de comparação. Quanto à força de desembrulhar tudo, tento errar com cautela. Eu acho que essa é uma questão fundamental para Swift em geral. Prefiro saber exatamente o que meu código fará em qualquer situação do que travar.decoder.decode([Config].self, from: data)
. (Observe os colchetes em torno de [Config])Esta resposta usa objetos nativos Swift em vez de NSDictionary.
Swift 3.0
fonte
Eu tenho trabalhado com o Swift 3.0 e queria contribuir com uma resposta para a sintaxe atualizada. Além disso, e possivelmente o mais importante, estou usando o PropertyListSerialization objeto para fazer o trabalho pesado, que é muito mais flexível do que apenas usar o NSDictionary, pois permite uma matriz como o tipo raiz da lista.
Abaixo está uma captura de tela do plist que estou usando. É um pouco complicado, de modo a mostrar a energia disponível, mas isso funcionará para qualquer combinação permitida de tipos de plist.
Como você pode ver, estou usando os dicionários Array of String: String para armazenar uma lista de nomes de sites e o URL correspondente.
Estou usando o objeto PropertyListSerialization , como mencionado acima, para fazer o trabalho pesado para mim. Além disso, o Swift 3.0 tornou-se mais "Swifty", de modo que todos os nomes de objetos perderam o prefixo "NS".
Após o código acima, as execuções
plist
serão do tipoArray<AnyObject>
, mas sabemos que tipo é realmente, para que possamos convertê-lo no tipo correto:E agora podemos acessar as várias propriedades do nosso Array of String: String Dictionaries de maneira natural. Espero convertê-los em estruturas ou classes fortemente tipificadas;)
fonte
É melhor usar dicionários e matrizes nativos porque eles foram otimizados para uso com o swift. Dito isto, você pode usar as classes NS ... rapidamente, e acho que essa situação justifica isso. Aqui está como você o implementaria:
Até agora (na minha opinião) essa é a maneira mais fácil e eficiente de acessar um plist, mas no futuro espero que a apple adicione mais funcionalidades (como o uso de plist) aos dicionários nativos.
fonte
Swift - Read / Write plist e arquivo de texto ....
fonte
Swift 2.0: Acessando a lista de informações
Eu tenho um dicionário chamado CoachMarksDictionary com um valor booleano no Info.Plist. Eu quero acessar o valor bool e torná-lo verdadeiro.
Escrevendo para Plist:
A partir de uma lista personalizada: - (Crie a partir de Arquivo-Novo-Arquivo-Recurso-PropertyList. Adicionadas três seqüências nomeadas: DashBoard_New, DashBoard_Draft, DashBoard_Completed)
O método pode ser chamado como
fonte
Convertido em uma extensão de conveniência através da resposta de Nick:
uso:
Eu gostaria de apostar que também funcionaria para criar uma extensão semelhante para Arrays
fonte
pode realmente fazê-lo em 1 linha
fonte
Você pode ler plist no idioma SWIFT desta maneira:
Leia o valor do dicionário único:
Se você deseja obter o dicionário multidimensional completo, plist:
Aqui está a lista:
fonte
Como essa resposta ainda não está aqui, basta destacar que você também pode usar a propriedade infoDictionary para obter a lista como um dicionário
Bundle.main.infoDictionary
,.Embora algo como
Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String)
possa ser mais rápido, se você estiver interessado apenas em um item específico na lista de informações.fonte
no meu caso, crio um
NSDictionary
chamadoappSettings
e adiciono todas as chaves necessárias. Para este caso, a solução é:fonte
objectForInfoDictionaryKey
era exatamente o que eu estava procurando.Você pode usar isso, eu crio uma extensão simples para o Dictionary no github https://github.com/DaRkD0G/LoadExtension
E você pode usar isso para carregar
fonte
Aqui está uma versão um pouco mais curta, com base na resposta do @connor
fonte
Swift 3.0
A maneira mais fácil de fazer isso na minha opinião.
fonte
Eu criei um
Dictionary
inicializador simples que substituiNSDictionary(contentsOfFile: path)
. Basta remover oNS
.Você pode usá-lo assim:
fonte
A lista do Swift 4.0 iOS 11.2.6 analisada e o código para analisá-la, com base na https://stackoverflow.com/users/3647770/ashok-r resposta acima.
fonte
Etapa 1 : maneira simples e mais rápida de analisar a lista em mais de 3+
Etapa 2: Como usar:
fonte
Aqui está a solução que encontrei:
Eu defino o tipo de
test
comoAnyObject
silenciar um aviso sobre uma inferência inesperada que poderia ocorrer.Além disso, isso deve ser feito em um método de classe.
Para acessar e salvar um valor específico de um tipo conhecido:
fonte
Eu uso dicionários rápidos, mas os converto para e de NSDictionaries na minha classe de gerenciador de arquivos da seguinte maneira:
Essa parece a maneira menos preocupante de ler e escrever, mas vamos manter o resto do meu código o mais rápido possível.
fonte
Plist é um enum Swift simples que eu criei para trabalhar com listas de propriedades.
Mais exemplos:
Plist.swift
Plist em si é bastante simples, aqui está sua lista, caso você se refira diretamente.
fonte
Swift 3.0
se você quiser ler uma "Matriz bidimensional" de .plist, tente da seguinte maneira:
fonte
Estrutura simples para acessar o arquivo plist (Swift 2.0)
Uso:
fonte