Ich spiele mit Apples neuer Programmiersprache Swift herum und habe einige Probleme ...
Derzeit versuche ich, eine Plist-Datei zu lesen. In Objective-C würde ich Folgendes tun, um den Inhalt als NSDictionary abzurufen:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Config" ofType:@"plist"];
NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:filePath];
Wie bekomme ich eine Liste als Wörterbuch in Swift?
Ich gehe davon aus, dass ich den Weg zur Liste finden kann mit:
let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist")
Wenn dies funktioniert (Wenn es korrekt ist?): Wie erhalte ich den Inhalt als Wörterbuch?
Auch eine allgemeinere Frage:
Ist es in Ordnung, die Standard- NS * -Klassen zu verwenden? Ich denke schon ... oder fehlt mir etwas? Soweit ich weiß, sind die Standard-Framework- NS * -Klassen noch gültig und in Ordnung zu verwenden?
Antworten:
In schnellem 3.0 Lesen von Plist.
Lesen Sie mehr SO VERWENDEN SIE EIGENTUMSLISTEN (.PLIST) IN SWIFT .
quelle
Sie können NSDictionaries weiterhin in Swift verwenden:
Für Swift 4
Für Swift 3+
Und ältere Versionen von Swift
Die NSClasses sind weiterhin verfügbar und können problemlos in Swift verwendet werden. Ich denke, sie werden wahrscheinlich bald den Fokus auf schnell verlagern wollen, aber derzeit verfügen die schnellen APIs nicht über alle Funktionen der Kern-NSClasses.
quelle
mainBundle()
ist gerademain
in Swift 3NSArray/NSDictionary
Lesen von Eigenschaftslistendaten überhaupt nicht verwenden .PropertyListSerialization
(und in Swift 4 alternativ dasCodable
Protokoll) ist die entsprechende API. Es bietet eine moderne Fehlerbehandlung und die Daten können direkt in native Swift-Sammlungstypen konvertiert werden.Folgendes mache ich, wenn ich eine .plist in ein Swift-Wörterbuch konvertieren möchte:
Bearbeitet für Swift 2.0:
Bearbeitet für Swift 3.0:
quelle
NSArray/NSDictionary
an allen Eigenschaftsliste Daten zu lesen.PropertyListSerialization
(und in Swift 4 alternativ dasCodable
Protokoll) ist die entsprechende API. Es bietet eine moderne Fehlerbehandlung und die Daten können direkt in native Swift-Sammlungstypen konvertiert werden.Swift 4.0
Sie können jetzt das Decodable-Protokoll verwenden, um eine .plist in eine benutzerdefinierte Struktur zu decodieren. Ich werde ein grundlegendes Beispiel für kompliziertere .plist-Strukturen durchgehen, die ich zum Lesen von Decodable / Encodable empfehle (eine gute Ressource finden Sie hier: https://benscheirman.com/2017/06/swift-json/ ).
Richten Sie zuerst Ihre Struktur im Format Ihrer .plist-Datei ein. In diesem Beispiel werde ich eine .plist mit einem Wörterbuch auf Stammebene und 3 Einträgen betrachten: 1 String mit dem Schlüssel "name", 1 Int mit dem Schlüssel "age" und 1 Boolean mit dem Schlüssel "single". Hier ist die Struktur:
Einfach genug. Nun der coole Teil. Mit der PropertyListDecoder-Klasse können wir die .plist-Datei einfach in eine Instanziierung dieser Struktur analysieren:
Nicht viel mehr Code, um den man sich sorgen muss, und alles in Swift. Besser noch, wir haben jetzt eine Instanziierung der Konfigurationsstruktur, die wir leicht verwenden können:
Dies druckt den Wert für die Schlüssel "Name", "Alter" und "Einzel" in der .plist.
quelle
Bundle.main.url(forResource: "Config", withExtension: "plist")
und loswerdenURL(fileURLWithPath
? Und da die Datei vorhanden sein muss (zur Entwurfs- / Kompilierungszeit), können alle Werte zwangsweise entpackt werden. Der Code darf nicht abstürzen, wenn alles richtig gestaltet ist.url(forResource: "Config", withExtension: "plist")
Ich habe nur verglichen, was die OP in ihrem Code als Vergleichspunkt getan hat. Was das Auspacken von Gewalt angeht, versuche ich, auf Nummer sicher zu gehen. Ich denke, das ist eine grundlegende Frage für Swift im Allgemeinen. Ich möchte lieber genau wissen, was mein Code in jeder Situation tut, als abstürzen.decoder.decode([Config].self, from: data)
. (Beachten Sie die Klammern um [Config])Diese Antwort verwendet native Swift-Objekte anstelle von NSDictionary.
Swift 3.0
quelle
Ich habe mit Swift 3.0 gearbeitet und wollte eine Antwort auf die aktualisierte Syntax liefern. Zusätzlich und möglicherweise noch wichtiger ist, dass ich das PropertyListSerialization- Objekt verwende, um das schwere Heben durchzuführen. Dies ist viel flexibler als nur das NSDictionary, da es ein Array als Stammtyp der Plist zulässt.
Unten ist ein Screenshot der von mir verwendeten Plist. Es ist ein bisschen kompliziert, um die verfügbare Leistung zu zeigen, aber dies funktioniert für jede zulässige Kombination von Plistentypen.
Wie Sie sehen können, verwende ich ein Array von String: String-Wörterbüchern, um eine Liste von Website-Namen und deren entsprechende URL zu speichern.
Ich verwende das PropertyListSerialization- Objekt, wie oben erwähnt, um das schwere Heben für mich zu erledigen. Außerdem ist Swift 3.0 "Swifty" geworden, sodass alle Objektnamen das Präfix "NS" verloren haben.
Nachdem der obige Code ausgeführt wurde
plist
, ist er vom TypArray<AnyObject>
, aber wir wissen, um welchen Typ es sich wirklich handelt, damit wir ihn in den richtigen Typ umwandeln können:Und jetzt können wir auf natürliche Weise auf die verschiedenen Eigenschaften unseres Array of String: String Dictionaries zugreifen. Hoffentlich um sie in tatsächlich stark typisierte Strukturen oder Klassen umzuwandeln;)
quelle
Es ist am besten, native Wörterbücher und Arrays zu verwenden, da diese für die Verwendung mit Swift optimiert wurden. Davon abgesehen können Sie NS ... -Klassen schnell verwenden, und ich denke, diese Situation rechtfertigt dies. So würden Sie es implementieren:
Bisher (meiner Meinung nach) ist dies der einfachste und effizienteste Weg, um auf eine Liste zuzugreifen. In Zukunft erwarte ich jedoch, dass Apple den nativen Wörterbüchern mehr Funktionen (z. B. die Verwendung der Liste) hinzufügt.
quelle
Swift - Lese- / Schreibliste und Textdatei ....
quelle
Swift 2.0: Zugriff auf Info.Plist
Ich habe ein Wörterbuch namens CoachMarksDictionary mit einem booleschen Wert in Info.Plist. Ich möchte auf den Bool-Wert zugreifen und ihn wahr machen.
Schreiben an Plist:
Aus einer benutzerdefinierten Liste: - (Aus Datei-Neue-Datei-Ressourcen-Eigenschaftsliste erstellen. Drei Zeichenfolgen mit dem Namen hinzugefügt: DashBoard_New, DashBoard_Draft, DashBoard_Completed)
Die Methode kann als aufgerufen werden
quelle
Über Nicks Antwort in eine Convenience-Erweiterung umgewandelt:
Verwendung:
Ich würde wetten, dass es auch funktionieren würde, eine ähnliche Erweiterung für Arrays zu erstellen
quelle
kann es tatsächlich in 1 Zeile tun
quelle
Sie können plist in SWIFT-Sprache folgendermaßen lesen:
Wert des einzelnen Wörterbuchs lesen:
Wenn Sie ein vollständiges mehrdimensionales Wörterbuch in plist erhalten möchten:
Hier ist die Liste:
quelle
Da diese Antwort noch nicht hier ist, möchten Sie nur darauf hinweisen, dass Sie auch die infoDictionary-Eigenschaft verwenden können, um die Info-Liste als Wörterbuch abzurufen
Bundle.main.infoDictionary
.Obwohl so etwas
Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String)
möglicherweise schneller ist, wenn Sie nur an einem bestimmten Element in der Info-Liste interessiert sind.quelle
In meinem Fall erstelle ich einen
NSDictionary
angerufenenappSettings
und füge alle benötigten Schlüssel hinzu. Für diesen Fall lautet die Lösung:quelle
objectForInfoDictionaryKey
war genau das, wonach ich gesucht habe.Sie können das verwenden, ich erstelle eine einfache Erweiterung für Dictionary in github https://github.com/DaRkD0G/LoadExtension
Und Sie können das zum Laden verwenden
quelle
Hier ist eine etwas kürzere Version, basierend auf der Antwort von @connor
quelle
Swift 3.0
Der einfachste Weg dies meiner Meinung nach zu tun.
quelle
Ich habe einen einfachen
Dictionary
Initialisierer erstellt, der ersetztNSDictionary(contentsOfFile: path)
. Entfernen Sie einfach dieNS
.Sie können es so verwenden:
quelle
Swift 4.0 iOS 11.2.6-Liste analysiert und Code zum Parsen, basierend auf der obigen Antwort https://stackoverflow.com/users/3647770/ashok-r .
quelle
Schritt 1 : Einfache und schnellste Methode zum Parsen von Plist in Swift 3+
Schritt 2: Verwendung:
quelle
Hier ist die Lösung, die ich gefunden habe:
Ich habe den Typ
test
so eingestelltAnyObject
, dass eine Warnung vor einer unerwarteten Schlussfolgerung, die auftreten kann , zum Schweigen gebracht wird.Es muss auch in einer Klassenmethode durchgeführt werden.
So greifen Sie auf einen bestimmten Wert eines bekannten Typs zu und speichern ihn:
quelle
Ich verwende schnelle Wörterbücher, konvertiere sie jedoch in und aus NSDictionaries in meiner Dateimanager-Klasse wie folgt:
Dies scheint die am wenigsten problematische Art zu lesen und zu schreiben, aber lassen Sie uns den Rest meines Codes so schnell wie möglich bleiben.
quelle
Plist ist eine einfache Swift-Aufzählung, die ich für die Arbeit mit Eigenschaftslisten erstellt habe.
Mehr Beispiele:
Plist.swift
Plist selbst ist recht einfach. Hier ist die Auflistung für den Fall, dass Sie direkt darauf verweisen.
quelle
Swift 3.0
Wenn Sie ein "2-dimensionales Array" aus .plist lesen möchten, können Sie es folgendermaßen versuchen:
quelle
Einfache Struktur für den Zugriff auf die Plist-Datei (Swift 2.0)
Verwendung:
quelle