Im Funktionsbeispiel scheint (read | write) DocumentsFromFile (...) mit einigen Funktionsumschlägen sicherlich sinnvoll zu sein, da für alles in OSx und iOS drei oder vier Hauptklassen instanziiert und eine Reihe von Eigenschaften konfiguriert, verknüpft, verknüpft werden müssen. instanziiert und eingestellt, nur um "Hallo" in eine Datei in 182 Ländern zu schreiben.
Diese Beispiele sind jedoch nicht vollständig genug, um in einem realen Programm verwendet zu werden. Die Schreibfunktion meldet keine Fehler beim Erstellen oder Schreiben in die Datei. Beim Lesen halte ich es nicht für eine gute Idee, einen Fehler zurückzugeben, dass die Datei nicht als Zeichenfolge vorhanden ist, die die gelesenen Daten enthalten soll. Sie möchten wissen, dass es fehlgeschlagen ist und warum, durch einen Benachrichtigungsmechanismus, wie eine Ausnahme. Anschließend können Sie Code schreiben, der das Problem ausgibt und es dem Benutzer ermöglicht, es zu beheben, oder das Programm an diesem Punkt "korrekt" unterbricht.
Sie möchten nicht einfach eine Zeichenfolge mit der Aufschrift "Fehlerdatei existiert nicht" zurückgeben. Dann müssten Sie jedes Mal nach dem Fehler in der Zeichenfolge suchen, wenn Sie die Funktion aufrufen, und ihn dort behandeln. Möglicherweise konnten Sie auch nicht wirklich feststellen, ob die Fehlerzeichenfolge tatsächlich aus einer tatsächlichen Datei gelesen wurde oder ob sie aus Ihrem Code erstellt wurde.
Sie können den Lesevorgang in Swift 2.2 und Xcode 7.3 nicht einmal so aufrufen, da NSString (contentOfFile ...) eine Ausnahme auslöst. Es ist ein Fehler bei der Kompilierung, wenn Sie keinen Code haben, um ihn abzufangen und etwas damit zu tun, z. B. Drucken auf stdout oder besser ein Fehler-Popup-Fenster oder stderr. Ich habe gehört, dass Apple sich von Try Catch und Ausnahmen entfernt, aber es wird ein langer Schritt sein und es ist nicht möglich, Code ohne dies zu schreiben. Ich weiß nicht, woher das Argument & error stammt, möglicherweise eine ältere Version, aber NSString.writeTo [Datei | URL] hat derzeit kein NSError-Argument. Sie sind in NSString.h wie folgt definiert:
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
Die nicht vorhandene Datei ist nur eines von vielen potenziellen Problemen, die Ihr Programm beim Lesen einer Datei haben kann, z. B. ein Berechtigungsproblem, die Dateigröße oder zahlreiche andere Probleme, für die Sie nicht einmal versuchen möchten, einen Handler zu codieren jeder von Ihnen. Es ist am besten, einfach davon auszugehen, dass alles korrekt ist, und eine Ausnahme zu fangen und zu drucken oder zu behandeln, wenn etwas nicht stimmt. Außerdem haben Sie zu diesem Zeitpunkt ohnehin keine Wahl.
Hier sind meine Umschreibungen:
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
}