Dans l'exemple de fonction, (lecture | écriture) DocumentsFromFile (...) ayant certains wrappers de fonction semble certainement logique puisque tout dans OSx et iOS semble avoir besoin de trois ou quatre classes principales instanciées et d'un tas de propriétés, configurées, liées, instancié et défini, juste pour écrire "Salut" dans un fichier, dans 182 pays.
Cependant, ces exemples ne sont pas suffisamment complets pour être utilisés dans un vrai programme. La fonction d'écriture ne signale aucune erreur lors de la création ou de l'écriture dans le fichier. À la lecture, je ne pense pas que ce soit une bonne idée de renvoyer une erreur indiquant que le fichier n'existe pas en tant que chaîne censée contenir les données lues. Vous voudriez savoir qu'il a échoué et pourquoi, à travers un mécanisme de notification, comme une exception. Ensuite, vous pouvez écrire du code qui renvoie quel est le problème et permet à l'utilisateur de le corriger, ou "correctement" interrompt le programme à ce stade.
Vous ne voudriez pas simplement renvoyer une chaîne contenant un «fichier d'erreur n'existe pas». Ensuite, vous devrez rechercher l'erreur dans la chaîne de l'appel de fonction à chaque fois et la gérer. Vous ne pouvez également pas vraiment savoir si la chaîne d'erreur a été réellement lue à partir d'un fichier réel ou si elle a été produite à partir de votre code.
Vous ne pouvez même pas appeler la lecture comme ceci dans swift 2.2 et Xcode 7.3 car NSString (contentsOfFile ...) lève une exception. Il s'agit d'une erreur de compilation si vous n'avez pas de code pour l'attraper et faire quelque chose avec, comme l'imprimer sur stdout, ou mieux, une fenêtre contextuelle d'erreur ou stderr. J'ai entendu dire qu'Apple s'éloignait des tentatives de capture et des exceptions, mais cela va être long et il n'est pas possible d'écrire du code sans cela. Je ne sais pas d'où vient l'argument & error, peut-être une version plus ancienne, mais NSString.writeTo [File | URL] n'a pas actuellement d'argument NSError. Ils sont définis comme ceci dans NSString.h:
public func writeToURL(url: NSURL, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throws
public func writeToFile(path: String, atomically useAuxiliaryFile: Bool, encoding enc: UInt) throws
public convenience init(contentsOfURL url: NSURL, encoding enc: UInt) throws
public convenience init(contentsOfFile path: String, encoding enc: UInt) throws
En outre, le fichier inexistant n'est que l'un des nombreux problèmes potentiels que votre programme pourrait rencontrer lors de la lecture d'un fichier, tels qu'un problème d'autorisations, la taille du fichier ou de nombreux autres problèmes pour lesquels vous ne voudriez même pas essayer de coder un gestionnaire pour chacun d'entre eux. Il vaut mieux supposer que tout est correct et attraper et imprimer, ou gérer, une exception si quelque chose ne va pas, d'ailleurs, à ce stade, vous n'avez pas vraiment le choix de toute façon.
Voici mes réécritures:
func writeToDocumentsFile(fileName:String,value:String) {
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString!
let path = documentsPath.stringByAppendingPathComponent(fileName)
do {
try value.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding)
} catch let error as NSError {
print("ERROR : writing to file \(path) : \(error.localizedDescription)")
}
}
func readFromDocumentsFile(fileName:String) -> String {
let documentsPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as NSString
let path = documentsPath.stringByAppendingPathComponent(fileName)
var readText : String = ""
do {
try readText = NSString(contentsOfFile: path, encoding: NSUTF8StringEncoding) as String
}
catch let error as NSError {
print("ERROR : reading from file \(fileName) : \(error.localizedDescription)")
}
return readText
}