Objektserialisierung in Swift: Codable, NSCoding und JSONEncoder

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Objektserialisierung in Swift (iOS/macOS)

\n

Serialisierung ist der Prozess der Umwandlung komplexer Objekte (Strukturen, Klassen, Instanzen) in ein Format, das zur Speicherung oder Übertragung über ein Netzwerk geeignet ist (JSON, Property List, Binärdaten). Deserialisierung ist der umgekehrte Prozess der Wiederherstellung eines Objekts aus diesen Daten. In Swift für iOS und macOS gibt es zwei Hauptansätze: das moderne Protokoll Codable (und seine Bestandteile Encodable und Decodable) sowie das ältere NSCoding aus dem Foundation-Framework. In diesem Artikel werden wir beide Ansätze mit Codebeispielen im Detail erläutern.

\n\n

1. Das Codable-Protokoll (empfohlener Weg)

\n

Codable ist ein Protokoll, das Encodable und Decodable vereint. Es ermöglicht die automatische Generierung von Code für Serialisierung und Deserialisierung, wenn alle Eigenschaften Ihrer Struktur oder Klasse ebenfalls Codable entsprechen (Zeichenketten, Zahlen, Daten, Arrays, Wörterbücher usw.).

\n\n

1.1. Grundlegende Serialisierung in JSON

\n

Betrachten wir eine einfache Benutzerstruktur:

\n
import Foundation\n\nstruct User: Codable {\n    let id: Int\n    var name: String\n    var email: String\n}\n\n// Erstellen einer Instanz\nlet user = User(id: 1, name: "Ivan Petrov", email: "ivan@example.com")\n\n// Serialisierung in Data (JSON)\nlet encoder = JSONEncoder()\nencoder.outputFormatting = .prettyPrinted // für lesbare Ausgabe\n\ndo {\n    let jsonData = try encoder.encode(user)\n    if let jsonString = String(data: jsonData, encoding: .utf8) {\n        print(jsonString)\n    }\n} catch {\n    print("Serialisierungsfehler: \\(error.localizedDescription)")\n}\n
\n\n

1.2. Deserialisierung aus JSON

\n
// Angenommen, wir haben einen JSON-String\nlet jsonString = """\n{\n    "id": 2,\n    "name": "Maria Smirnova",\n    "email": "maria@test.com"\n}\n"""\n\nlet jsonData = Data(jsonString.utf8)\nlet decoder = JSONDecoder()\n\ndo {\n    let decodedUser = try decoder.decode(User.self, from: jsonData)\n    print("Name: \\(decodedUser.name), Email: \\(decodedUser.email)")\n} catch {\n    print("Deserialisierungsfehler: \\(error.localizedDescription)")\n}\n
\n\n

1.3. Anpassung von Schlüsseln (CodingKeys)

\n

Wenn die Eigenschaftsnamen in Swift von den Schlüsseln in JSON abweichen, verwenden Sie die Aufzählung CodingKeys:

\n
struct Article: Codable {\n    var title: String\n    var body: String\n    var publicationDate: Date\n\n    enum CodingKeys: String, CodingKey {\n        case title\n        case body\n        case publicationDate = "published_at" // Schlüssel in JSON\n    }\n}\n\nlet articleJSON = """\n{"title":"Swift Codable","body":"Artikeltext","published_at":"2024-01-15T10:00:00Z"}\n"""\nlet articleData = Data(articleJSON.utf8)\nlet decoder = JSONDecoder()\ndecoder.dateDecodingStrategy = .iso8601 // für korrektes Parsen des Datums\n\nif let article = try? decoder.decode(Article.self, from: articleData) {\n    print("Titel: \\(article.title), Datum: \\(article.publicationDate)")\n}\n
\n\n

1.4. PropertyListEncoder / PropertyListDecoder

\n

Für die Serialisierung in das Property-List-Format (XML oder binär) verwenden Sie PropertyListEncoder:

\n
let plistEncoder = PropertyListEncoder()\nplistEncoder.outputFormat = .xml\n\nif let plistData = try? plistEncoder.encode(user) {\n    // plistData kann in einer Datei gespeichert werden\n    let plistString = String(data: plistData, encoding: .utf8)\n    print(plistString ?? "Ungültige Daten")\n}\n
\n\n

2. Das NSCoding-Protokoll (für von NSObject abgeleitete Klassen)

\n

NSCoding ist ein Protokoll aus Objective-C, das immer noch zur Serialisierung von Klassen verwendet wird, insbesondere solcher, die mit UIKit/AppKit arbeiten (z. B. UIView, UIViewController). Es erfordert, dass die Klasse von NSObject erbt und die Methoden encode(with:) und init?(coder:) implementiert.

\n\n

2.1. Beispiel einer Klasse mit NSCoding

\n
                    

Empfehlungen