Je joue avec le nouveau langage de programmation Swift d' Apple et j'ai quelques problèmes ...
Actuellement, j'essaie de lire un fichier plist, dans Objective-C, je ferais ce qui suit pour obtenir le contenu en tant que NSDictionary:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];
Comment obtenir un plist en tant que dictionnaire dans Swift?
Je suppose que je peux obtenir le chemin vers le plist avec:
let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist")
Quand cela fonctionne (si c'est correct?): Comment puis-je obtenir le contenu sous forme de dictionnaire?
Aussi une question plus générale:
Est-il correct d'utiliser les classes NS * par défaut ? Je pense que oui ... ou est-ce que je manque quelque chose? Autant que je sache, les classes NS * du framework par défaut sont toujours valides et correctes?
Réponses:
Dans swift 3.0 Reading from Plist.
En savoir plus COMMENT UTILISER LES LISTES DE PROPRIÉTÉ (.PLIST) DANS SWIFT .
la source
Vous pouvez toujours utiliser NSDictionaries dans Swift:
Pour Swift 4
Pour Swift 3+
Et les anciennes versions de Swift
Les NSClasses sont toujours disponibles et parfaitement adaptés à Swift. Je pense qu'ils voudront probablement changer d'orientation rapidement, mais actuellement les API rapides n'ont pas toutes les fonctionnalités des NSClasses de base.
la source
mainBundle()
c'est justemain
dans Swift 3NSArray/NSDictionary
pour lire les données de la liste des propriétés.PropertyListSerialization
(et dans Swift 4 alternativement leCodable
protocole) est l'API appropriée. Il offre une gestion moderne des erreurs et les données peuvent être converties directement en types de collection Swift natifs.Voici ce que je fais si je veux convertir un .plist en un dictionnaire Swift:
Modifié pour Swift 2.0:
Modifié pour Swift 3.0:
la source
NSArray/NSDictionary
pour lire les données de la liste des propriétés.PropertyListSerialization
(et dans Swift 4 alternativement leCodable
protocole) est l'API appropriée. Il offre une gestion moderne des erreurs et les données peuvent être converties directement en types de collection Swift natifs.Swift 4.0
Vous pouvez maintenant utiliser le protocole Decodable pour décoder un .plist dans une structure personnalisée. Je vais passer en revue un exemple de base, pour les structures .plist plus compliquées, je recommande de lire sur Decodable / Encodable (une bonne ressource est ici: https://benscheirman.com/2017/06/swift-json/ ).
Configurez d'abord votre structure au format de votre fichier .plist. Pour cet exemple, je considérerai un .plist avec un dictionnaire de niveau racine et 3 entrées: 1 chaîne avec la clé "nom", 1 int avec la clé "age" et 1 booléen avec la clé "single". Voici la structure:
Assez simple. Maintenant, la partie cool. En utilisant la classe PropertyListDecoder, nous pouvons facilement analyser le fichier .plist dans une instanciation de cette structure:
Pas beaucoup plus de code à se soucier, et tout est dans Swift. Mieux encore, nous avons maintenant une instanciation de la structure Config que nous pouvons facilement utiliser:
Cela imprime la valeur des clés "nom", "âge" et "unique" dans le .plist.
la source
Bundle.main.url(forResource: "Config", withExtension: "plist")
et s'en débarrasserURL(fileURLWithPath
? Et comme le fichier doit exister (au moment de la conception / compilation), toutes les valeurs peuvent être forcées à être dépliées. Le code ne doit pas planter si tout est correctement conçu.url(forResource: "Config", withExtension: "plist")
Je faisais juste correspondre ce que l'OP a fait dans leur code comme point de comparaison. Pour ce qui est de tout déballer de force, j'essaie de faire preuve de prudence. Je pense que c'est une question fondamentale pour Swift en général. Je préfère savoir exactement ce que mon code fera dans n'importe quelle situation plutôt que de planter.decoder.decode([Config].self, from: data)
. (Notez les crochets autour de [Config])Cette réponse utilise des objets natifs Swift plutôt que NSDictionary.
Swift 3.0
la source
J'ai travaillé avec Swift 3.0 et je voulais apporter une réponse à la syntaxe mise à jour. De plus, et peut-être plus important encore, j'utilise l' objet PropertyListSerialization pour faire le gros du travail, ce qui est beaucoup plus flexible que de simplement utiliser NSDictionary car il permet un tableau comme type racine du plist.
Voici une capture d'écran de la liste que j'utilise. C'est un peu compliqué, afin de montrer la puissance disponible, mais cela fonctionnera pour n'importe quelle combinaison autorisée de types de plist.
Comme vous pouvez le voir, j'utilise un ensemble de dictionnaires String: String pour stocker une liste de noms de sites Web et leur URL correspondante.
J'utilise l' objet PropertyListSerialization , comme mentionné ci-dessus, pour faire le gros du travail pour moi. De plus, Swift 3.0 est devenu plus "Swifty", donc tous les noms d'objets ont perdu le préfixe "NS".
Une fois le code ci-dessus exécuté,
plist
il sera de typeArray<AnyObject>
, mais nous savons de quel type il s'agit vraiment afin que nous puissions le convertir au type correct:Et maintenant, nous pouvons accéder aux différentes propriétés de notre Array of String: String Dictionaries de manière naturelle. Espérons les convertir en structures ou classes réelles fortement typées;)
la source
Il est préférable d'utiliser des dictionnaires et des tableaux natifs car ils ont été optimisés pour une utilisation avec swift. Cela étant dit, vous pouvez utiliser les classes NS ... rapidement et je pense que cette situation le justifie. Voici comment vous le mettriez en œuvre:
Jusqu'à présent (à mon avis), c'est le moyen le plus simple et le plus efficace d'accéder à un plist, mais à l'avenir, je m'attends à ce qu'Apple ajoute plus de fonctionnalités (comme l'utilisation de plist) dans les dictionnaires natifs.
la source
Swift - Lecture / écriture plist et fichier texte ....
la source
Swift 2.0: Accès à Info.Plist
J'ai un dictionnaire nommé CoachMarksDictionary avec une valeur booléenne dans Info.Plist. Je veux accéder à la valeur booléenne et la rendre vraie.
Ecrire à Plist:
À partir d'une liste personnalisée: - (Créer à partir de File-New-File-Resource-PropertyList. Ajout de trois chaînes nommées: DashBoard_New, DashBoard_Draft, DashBoard_Completed)
La méthode peut être appelée comme
la source
Converti en une extension de commodité via la réponse de Nick:
usage:
Je serais prêt à parier que cela fonctionnerait également pour créer une extension similaire pour les tableaux
la source
peut réellement le faire en 1 ligne
la source
Vous pouvez lire plist dans SWIFT Language de cette manière:
Lire la valeur du dictionnaire unique:
Si vous souhaitez obtenir un dictionnaire multidimensionnel complet dans plist:
Voici le plist:
la source
Étant donné que cette réponse est pas encore là, je voulais juste faire remarquer , vous pouvez également utiliser la propriété infoDictionary pour obtenir le plist info comme un dictionnaire,
Bundle.main.infoDictionary
.Bien que quelque chose comme cela
Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String)
puisse être plus rapide si vous n'êtes intéressé que par un élément spécifique dans la liste d'informations.la source
dans mon cas, je crée un
NSDictionary
appeléappSettings
et ajoute toutes les clés nécessaires. Dans ce cas, la solution est:la source
objectForInfoDictionaryKey
était exactement ce que je cherchais.Vous pouvez l'utiliser, je crée une extension simple pour Dictionary dans github https://github.com/DaRkD0G/LoadExtension
Et vous pouvez l'utiliser pour charger
la source
Voici une version un peu plus courte, basée sur la réponse de @connor
la source
Swift 3.0
La façon la plus simple de le faire à mon avis.
la source
J'ai créé un simple
Dictionary
initialiseur qui remplaceNSDictionary(contentsOfFile: path)
. Retirez simplement leNS
.Vous pouvez l'utiliser comme ceci:
la source
Swift 4.0 iOS 11.2.6 liste analysée et code pour l'analyser, basé sur la réponse https://stackoverflow.com/users/3647770/ashok-r ci-dessus.
la source
Étape 1 : moyen simple et rapide d'analyser le plist dans Swift 3+
Étape 2: Comment utiliser:
la source
Voici la solution que j'ai trouvée:
J'ai défini le type de
test
pourAnyObject
faire taire un avertissement concernant une inférence inattendue qui pourrait se produire.De plus, cela doit être fait dans une méthode de classe.
Pour accéder et enregistrer une valeur spécifique d'un type connu:
la source
J'utilise des dictionnaires rapides mais les convertis vers et depuis NSDictionaries dans ma classe de gestionnaire de fichiers comme ceci:
Cela semble la façon la moins troublante de lire et d'écrire, mais laissons le reste de mon code aussi rapide que possible.
la source
Plist est une énumération Swift simple que j'ai faite pour travailler avec des listes de propriétés.
Plus d'exemples:
Plist.swift
Plist lui-même est assez simple, voici sa liste au cas où vous vous référeriez directement.
la source
Swift 3.0
si vous voulez lire un "tableau bidimensionnel" de .plist, vous pouvez l'essayer comme ceci:
la source
Structure simple pour accéder au fichier plist (Swift 2.0)
Usage:
la source