En el ejemplo de función, (leer | escribir) DocumentsFromFile (...) tener algunos envoltorios de funciones ciertamente parece tener sentido ya que todo en OSx e iOS parece necesitar tres o cuatro clases principales instanciadas y un montón de propiedades, configuradas, vinculadas, instanciado y configurado, solo para escribir "Hola" a un archivo, en 182 países.
Sin embargo, estos ejemplos no son lo suficientemente completos como para usarlos en un programa real. La función de escritura no informa ningún error al crear o escribir en el archivo. En la lectura, no creo que sea una buena idea devolver un error de que el archivo no existe como la cadena que se supone que contiene los datos que se leyeron. Desearía saber que falló y por qué, a través de algún mecanismo de notificación, como una excepción. Luego, puede escribir un código que muestre cuál es el problema y permite que el usuario lo corrija, o "correctamente" interrumpe el programa en ese punto.
No querrá devolver una cadena con el mensaje "El archivo de error no existe". Entonces, tendría que buscar el error en la cadena de la función de llamada cada vez y manejarlo allí. Posiblemente, tampoco podría saber realmente si la cadena de error se leyó realmente de un archivo real, o si se produjo a partir de su código.
Ni siquiera puede llamar a la lectura de esta manera en swift 2.2 y Xcode 7.3 porque NSString (contentsOfFile ...) arroja una excepción. Es un error de tiempo de compilación si no tiene ningún código para atraparlo y hacer algo con él, como imprimirlo en stdout, o mejor, una ventana emergente de error o stderr. He oído que Apple se está alejando del intento de captura y excepciones, pero va a ser un movimiento largo y no es posible escribir código sin esto. No sé de dónde viene el argumento & error, quizás una versión anterior, pero NSString.writeTo [File | URL] actualmente no tiene un argumento NSError. Se definen así en 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
Además, el archivo que no existe es solo uno de una serie de problemas potenciales que su programa podría tener al leer un archivo, como un problema de permisos, el tamaño del archivo u otros muchos problemas para los que ni siquiera querría intentar codificar un controlador cada uno de ellos. Es mejor asumir que todo está correcto y atrapar e imprimir, o manejar, una excepción si algo sale mal, además, en este punto, en realidad no tiene otra opción.
Aquí están mis reescrituras:
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
}