Warum Swift nicht nur UI, sondern auch Dateien kann
\n\nWenn Entwickler mit Swift beginnen, schreiben sie meistens Apps mit Oberflächen, Animationen und Netzwerkanfragen. Aber früher oder später kommt die Aufgabe: Daten auf dem Gerät speichern, eine Konfiguration lesen, eine JSON-Datei parsen oder einfach ein Dokument kopieren. Und dann sind viele ratlos. Zu Unrecht – die Arbeit mit Dateien in Swift ist so elegant und durchdacht, dass man nach ihr nicht mehr in andere Sprachen zurückkehren möchte.
\n\nIn diesem Artikel behandeln wir die Interaktion mit dem Dateisystem in Swift vom Einfachen zum Komplexen. Sie erfahren, wie Sie Dateien erstellen, lesen, schreiben und löschen, mit Verzeichnissen arbeiten, Fehler behandeln und sogar Daten verschlüsseln. Los geht's!
\n\nGrundlagen: FileManager und FileHandle
\n\nDas Herz des Dateisystems in Swift ist die Klasse FileManager. Es ist ein „Verwalter“, der alles über Ordner und Dateien auf dem Gerät weiß. Er ermöglicht es, die Existenz zu prüfen, Objekte zu verschieben, zu kopieren und zu löschen. Für die Arbeit mit Dateiinhalten (Lesen und Schreiben) wird FileHandle oder höherwertige Methoden von Data, String und Codable verwendet.
Wo Dateien speichern? Pfade und Verzeichnisse
\n\nBevor wir Code schreiben, müssen wir verstehen, wo wir Daten speichern dürfen. In iOS und macOS gibt es strenge Regeln: Eine App kann nur in ihre Sandbox schreiben. Die gängigsten Verzeichnisse sind:
\n\n- \n
- Documents – für Benutzerdaten, die bei Backups erhalten bleiben sollen. \n
- Library/Caches – für temporäre Dateien, die das System löschen kann. \n
- tmp – für einmalige Dateien, wird beim Neustart gelöscht. \n
Den Pfad zum gewünschten Ordner zu erhalten, ist ganz einfach:
\n\nimport Foundation\n\nlet fileManager = FileManager.default\nlet documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!\nprint("Documents: \\(documentsURL.path)")\n\nlet cachesURL = fileManager.urls(for: .cachesDirectory, in: .userDomainMask).first!\nprint("Caches: \\(cachesURL.path)")\n\nErstellen und Löschen von Dateien in Swift
\n\nBeginnen wir mit dem Einfachsten – erstellen wir eine leere Datei im Documents-Verzeichnis:
\n\nlet fileURL = documentsURL.appendingPathComponent("myFile.txt")\n\n// Datei erstellen, falls sie nicht existiert\nif !fileManager.fileExists(atPath: fileURL.path) {\n fileManager.createFile(atPath: fileURL.path, contents: nil, attributes: nil)\n print("Datei erstellt!")\n}\n\nBeachten Sie: createFile(atPath:contents:attributes:) gibt einen Bool zurück, der angibt, ob die Datei erstellt wurde. Überprüfen Sie immer das Ergebnis – das schützt vor unerwarteten Fehlern.
Das Löschen einer Datei erfolgt mit einer Zeile:
\n\ndo {\n try fileManager.removeItem(at: fileURL)\n print("Datei gelöscht")\n} catch {\n print("Fehler beim Löschen: \\(error.localizedDescription)")\n}\n\nHier verwenden wir try und einen do-catch-Block – der Standardansatz zur Fehlerbehandlung in Swift. Rufen Sie removeItem niemals ohne Prüfung auf, sonst stürzt die App ab.
Lesen und Schreiben von Textdateien
\n\nDas häufigste Szenario ist die Arbeit mit Textdaten. Swift bietet praktische Methoden zum Lesen einer Datei in Swift und zum Schreiben über Strings:
\n\n// Text schreiben\nlet text = "Hallo, Welt! Hello, Swift!"\ndo {\n try text.write(to: fileURL, atomically: true, encoding: .utf8)\n print("Text geschrieben")\n} catch {\n print("Fehler beim Schreiben: \\(error)")\n}\n\n// Text lesen\ndo {\n let savedText = try String(contentsOf: fileURL, encoding: .utf8)\n print("Gelesen: \\(savedText)")\n} catch {\n print("Fehler beim Lesen: \\(error)")\n}\n\nDas Flag atomically: true stellt sicher, dass der Schreibvorgang atomar ist – die Daten werden zuerst in eine temporäre Datei geschrieben und dann ersetzt. So wird verhindert, dass bei einem Absturz eine beschädigte Datei zurückbleibt.