W przykładzie funkcji (odczyt | zapis) DocumentsFromFile (...) z pewnymi opakowaniami funkcji z pewnością wydaje się mieć sens, ponieważ wszystko w OSx i iOS wydaje się wymagać utworzenia trzech lub czterech głównych klas oraz szeregu właściwości, skonfigurowanych, połączonych, utworzono instancję i ustawiono, aby napisać „Cześć” do pliku w 182 krajach.
Jednak te przykłady nie są wystarczająco kompletne, aby można je było wykorzystać w prawdziwym programie. Funkcja zapisu nie zgłasza żadnych błędów podczas tworzenia lub zapisu do pliku. Po przeczytaniu nie sądzę, że dobrym pomysłem jest zwrócenie błędu, że plik nie istnieje jako ciąg znaków, który powinien zawierać odczytane dane. Chcesz wiedzieć, że to się nie udało i dlaczego, za pomocą mechanizmu powiadamiania, takiego jak wyjątek. Następnie możesz napisać kod, który pokazuje, na czym polega problem i pozwala użytkownikowi go naprawić lub „poprawnie” zepsuć program w tym momencie.
Nie chcesz po prostu zwracać ciągu z napisem „Plik błędu nie istnieje”. Następnie należy za każdym razem szukać błędu w łańcuchu wywołania funkcji i tam go obsłużyć. Prawdopodobnie nie możesz naprawdę stwierdzić, czy łańcuch błędu został odczytany z rzeczywistego pliku, czy też został wygenerowany z Twojego kodu.
Nie można nawet wywoływać odczytu w ten sposób w szybkich wersjach 2.2 i Xcode 7.3, ponieważ NSString (contentOfFile ...) zgłasza wyjątek. Jest to błąd czasu kompilacji, jeśli nie masz żadnego kodu, aby go złapać i coś z nim zrobić, na przykład wydrukować go na standardowe wyjście, lub lepiej, wyskakujące okno błędu lub stderr. Słyszałem, że Apple odchodzi od try catch i wyjątków, ale będzie to długi krok i bez tego nie będzie możliwe pisanie kodu. Nie wiem, skąd pochodzi argument & error, być może starsza wersja, ale NSString.writeTo [Plik | URL] nie ma obecnie argumentu NSError. Są one zdefiniowane w ten sposób w 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
Ponadto plik nieistniejący jest tylko jednym z wielu potencjalnych problemów, które Twój program może odczytać, takich jak problem z uprawnieniami, rozmiar pliku lub wiele innych problemów, dla których nie chcesz nawet kodować procedury obsługi każdy z nich. Najlepiej po prostu założyć, że wszystko jest poprawne i złapać i wydrukować lub obsłużyć wyjątek, jeśli coś pójdzie nie tak, poza tym w tym momencie tak naprawdę nie masz wyboru.
Oto moje przepisania:
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
}