Comment lire et écrire des chaînes dans des fichiers texte en Swift : un regard sous le capot
\n\nChaque développeur, quel que soit le langage, est tôt ou tard confronté à la tâche : lire et écrire une chaîne depuis un fichier texte. Rien de plus simple, semble-t-il ? Mais en Swift, avec son système de types strict et sa sécurité, ce processus se transforme en un voyage fascinant dans le monde des descripteurs de fichiers, des encodages et des gestionnaires de fichiers. Si vous vous êtes déjà demandé : « Que se passe-t-il réellement quand j'appelle write(to:) ou String(contentsOf:) ? » — cet article est pour vous.
Nous ne nous contenterons pas de montrer des solutions toutes faites, mais nous détaillerons chaque étape : de la recherche du fichier dans le bac à sable à l'écriture des octets sur le disque. Attachez vos ceintures, ça va être intéressant !
\n\nPourquoi Swift ne permet-il pas simplement d'écrire File.write(text) ?
\n\nContrairement à Python ou JavaScript, où l'on peut ouvrir et écrire un fichier en une seule ligne, Swift exige de spécifier explicitement : dans quel encodage est la chaîne ? Où sauvegarder (dans Documents, Caches, Temp) ? Que faire si le fichier n'existe pas ? Ce n'est pas un bug, mais une fonctionnalité : cette approche prévient les fuites de données et garantit que vous contrôlez chaque étape.
\n\nÀ la base, tout repose sur trois composants clés :
\n- \n
- FileManager — le « gestionnaire » qui sait où se trouvent tous les dossiers de votre application. \n
- Data — les octets bruts. C'est avec eux que le système de fichiers travaille. \n
- String — notre représentation de haut niveau, qui doit être convertie en Data et vice versa. \n
Lorsque vous écrivez lire et écrire une chaîne depuis un fichier texte, sous le capot se produit une chaîne : String → Data (encodage) → écriture des octets sur le disque (via FileHandle ou la méthode Data).
Exemple pratique : écrire une chaîne dans un fichier
\n\nCommençons par le scénario le plus simple et le plus utile. Imaginez que vous développez une application de journal intime et que vous souhaitez sauvegarder le texte d'une note.
\n\nimport Foundation\n\nlet textToSave = "Bonjour le monde ! Aujourd'hui est une excellente journée pour apprendre Swift."\nlet fileName = "my_note.txt"\n\n// 1. Obtenir le chemin vers le répertoire Documents\nguard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {\n fatalError("Impossible d'obtenir le répertoire Documents")\n}\n\n// 2. Créer le chemin complet vers le fichier\nlet fileURL = documentsDirectory.appendingPathComponent(fileName)\n\n// 3. Convertir la chaîne en Data (en encodage UTF-8)\nguard let data = textToSave.data(using: .utf8) else {\n fatalError("Erreur d'encodage de la chaîne")\n}\n\n// 4. Écrire les données sur le disque\ndo {\n try data.write(to: fileURL, options: .atomic)\n print("Fichier sauvegardé avec succès au chemin : \\(fileURL.path)")\n} catch {\n print("Erreur d'écriture : \\(error.localizedDescription)")\n}\n\nQue se passe-t-il sous le capot ici ?
\n- \n
FileManager.default.urls(for:in:)— retourne l'URL du répertoire. Sous iOS, il s'agit d'un bac à sable isolé. \n data(using: .utf8)— chaque caractère de la chaîne (même les emojis) est encodé en un ou plusieurs octets selon la norme UTF-8. \n data.write(to:options:)— un appel système qui écrit atomiquement (si.atomicest spécifié) les données dans un fichier temporaire, puis le renomme en fichier cible. Cela protège contre la corruption des données en cas de panne. \n
Lecture d'une chaîne depuis un fichier : le processus inverse
\n\nMaintenant que nous avons sauvegardé la note, lisons-la. C'est un exemple classique de lire et écrire une chaîne depuis un fichier texte en action.
\n\nimport Foundation\n\nlet fileName = "my_note.txt"\n\nguard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {\n fatalError("Impossible d'obtenir le répertoire Documents")\n}\n\nlet fileURL = documentsDirectory.appendingPathComponent(fileName)\n\ndo {\n // 1. Lire les données brutes