No exemplo de função, (ler | escrever) DocumentsFromFile (...) ter alguns wrappers de função certamente parece fazer sentido, pois tudo no OSx e iOS parece precisar de três ou quatro classes principais instanciadas e um monte de propriedades, configuradas, vinculadas, instanciado e definido apenas para escrever "Oi" em um arquivo, em 182 países.
No entanto, esses exemplos não são completos o suficiente para serem usados em um programa real. A função de gravação não relata erros ao criar ou gravar no arquivo. Na leitura, não acho uma boa ideia retornar um erro de que o arquivo não existe como a sequência que deveria conter os dados lidos. Você gostaria de saber que ela falhou e por que, através de algum mecanismo de notificação, como uma exceção. Em seguida, você pode escrever um código que mostre qual é o problema e permita que o usuário o corrija ou que "corretamente" interrompa o programa nesse momento.
Você não gostaria apenas de retornar uma string com um "arquivo de erro não existe". Em seguida, você teria que procurar o erro na sequência de chamada da função a cada vez e manipulá-la lá. Você também não pode realmente dizer se a sequência de erros foi realmente lida em um arquivo real ou se foi produzida a partir do seu código.
Você não pode nem chamar a leitura assim no swift 2.2 e no Xcode 7.3 porque o NSString (contentsOfFile ...) lança uma exceção. É um erro de tempo de compilação se você não tiver nenhum código para capturá-lo e fazer algo com ele, como imprimi-lo no stdout, ou melhor, em uma janela pop-up de erro ou stderr. Ouvi dizer que a Apple está se afastando do try catch e das exceções, mas será uma mudança longa e não é possível escrever código sem isso. Não sei de onde vem o argumento & error, talvez uma versão mais antiga, mas o NSString.writeTo [File | URL] não possui atualmente um argumento NSError. Eles são definidos assim no 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
Além disso, o arquivo não existente é apenas um dos vários problemas em potencial que seu programa pode ter ao ler um arquivo, como um problema de permissões, o tamanho do arquivo ou vários outros problemas que você nem gostaria de tentar codificar para um manipulador. cada um deles. É melhor presumir que está tudo correto e capturar e imprimir, ou manipular, uma exceção se algo der errado, além disso, neste momento, você realmente não tem escolha.
Aqui estão minhas reescritas:
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
}