На прикладі функцій (читати | записувати) DocumentsFromFile (...), що має деякі обгортки функцій, звичайно, мабуть, є сенс, оскільки все, що працює в OSx та iOS, потребує трьох-чотирьох основних класів, а також властивості, налаштовані, пов'язані, ініціювати та встановити, просто написати "Привіт" у файл у 182 країнах.
Однак ці приклади недостатньо повно для використання в реальній програмі. Функція запису не повідомляє про помилки під час створення чи запису у файл. Щодо прочитаного, я не думаю, що було б гарною ідеєю повернути помилку, що файл не існує як рядок, який повинен містити прочитані дані. Ви хотіли б знати, що це не вдалося, і чому, через якийсь механізм оповіщення, як виняток. Потім ви можете написати якийсь код, який виводить проблему і дозволяє користувачеві її виправити, або "правильно" порушує програму в цей момент.
Ви не хотіли б просто повернути рядок з файлом "Помилка не існує". Тоді вам доведеться щоразу шукати помилку в рядку від функції виклику та обробляти її там. Ви також, ймовірно, не могли сказати, чи насправді рядок помилок читався з фактичного файлу чи він був створений з вашого коду.
Ви навіть не можете викликати таке читання у швидкому 2.2 та Xcode 7.3, оскільки NSString (contentOfFile ...) кидає виняток. Це помилка часу компіляції, якщо у вас немає жодного коду, щоб виловити його і зробити щось з ним, наприклад, надрукувати його в stdout, а ще краще - спливаюче вікно помилок або stderr. Я чув, що Apple відходить від спроб вилову та винятків, але це буде довгий крок, і неможливо написати код без цього. Я не знаю, звідки береться аргумент & error, можливо, старша версія, але NSString.writeTo [Файл | 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
}