В примере функции (read | write) DocumentsFromFile (...), имеющий некоторые обертки функций, безусловно, имеет смысл, так как все в OSx и iOS, кажется, требует создания трех или четырех основных классов и набора свойств, настроенных, связанных, создан и установлен, чтобы просто написать «Привет» в файл, в 182 странах.
Однако эти примеры недостаточно полны для использования в реальной программе. Функция записи не сообщает об ошибках создания или записи в файл. При чтении я не думаю, что будет хорошей идеей вернуть ошибку, что файл не существует в виде строки, которая должна содержать данные, которые были прочитаны. Вы хотели бы знать, что это не удалось и почему, через какой-то механизм уведомления, как исключение. Затем вы можете написать некоторый код, который выводит, в чем заключается проблема, и позволяет пользователю ее исправить, или «правильно» ломает программу в этой точке.
Вы бы не хотели просто возвращать строку с «файлом ошибок не существует». Затем вам нужно будет каждый раз искать ошибку в строке при вызове функции и обрабатывать ее там. Вы также, возможно, не могли точно сказать, была ли строка ошибки действительно прочитана из фактического файла, или она была сгенерирована из вашего кода.
Вы не можете даже вызвать чтение как это в swift 2.2 и Xcode 7.3, потому что NSString (contentsOfFile ...) выдает исключение. Это ошибка времени компиляции, если у вас нет кода, чтобы перехватить его и что-то с ним сделать, например напечатать его в stdout или, что еще лучше, всплывающее окно с ошибкой или stderr. Я слышал, что Apple отказывается от попыток перехвата и исключений, но это будет долгий шаг, и без этого невозможно написать код. Я не знаю, откуда берется аргумент & error, возможно, более старая версия, но NSString.writeTo [File | URL] в настоящее время не имеет аргумента NSError. Они определены так в 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
Кроме того, несуществующий файл - это лишь одна из потенциальных проблем, с которыми ваша программа может столкнуться при чтении файла, таких как проблема с разрешениями, размером файла или множеством других проблем, которые вы даже не захотите пытаться кодировать обработчиком. каждый из них. Лучше всего просто предположить, что все правильно, и поймать и распечатать или обработать исключение, если что-то пойдет не так, кроме того, на данный момент у вас все равно нет выбора.
Вот мои переписывает:
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
}