Trong ví dụ về chức năng, (đọc | ghi) DocumentsFromFile (...) có một số trình bao bọc chức năng dường như có ý nghĩa vì mọi thứ trong OSx và iOS dường như cần ba hoặc bốn lớp chính được khởi tạo và một loạt các thuộc tính, được định cấu hình, liên kết, khởi tạo và thiết lập, chỉ để viết "Hi" vào một tệp ở 182 quốc gia.
Tuy nhiên, những ví dụ này không đủ để sử dụng trong một chương trình thực. Hàm ghi không báo cáo bất kỳ lỗi nào khi tạo hoặc ghi vào tệp. Khi đọc, tôi không nghĩ nên trả lại lỗi rằng tệp không tồn tại dưới dạng chuỗi được cho là chứa dữ liệu đã đọc. Bạn sẽ muốn biết rằng nó đã thất bại và tại sao, thông qua một số cơ chế thông báo, giống như một ngoại lệ. Sau đó, bạn có thể viết một số mã đưa ra vấn đề là gì và cho phép người dùng sửa nó hoặc "chính xác" phá vỡ chương trình tại thời điểm đó.
Bạn sẽ không muốn trả về một chuỗi có "Tệp lỗi không tồn tại" trong đó. Sau đó, bạn sẽ phải tìm lỗi trong chuỗi từ chức năng gọi mỗi lần và xử lý nó ở đó. Bạn cũng có thể không thực sự biết được chuỗi lỗi có thực sự được đọc từ một tệp thực sự hay nếu nó được tạo ra từ mã của bạn.
Bạn thậm chí không thể gọi đọc như thế này trong swift 2.2 và Xcode 7.3 vì NSString (nội dungOfFile ...) ném ngoại lệ. Đó là lỗi thời gian biên dịch nếu bạn không có bất kỳ mã nào để bắt nó và làm một cái gì đó với nó, như in nó ra thiết bị xuất chuẩn, hoặc tốt hơn, một cửa sổ bật lên lỗi hoặc stderr. Tôi đã nghe nói rằng Apple đang tránh xa việc thử và ngoại lệ, nhưng sẽ là một bước tiến dài và không thể viết mã nếu không có điều này. Tôi không biết đối số & lỗi đến từ đâu, có lẽ là phiên bản cũ hơn, nhưng NSString.writeTo [File | URL] hiện không có đối số NSError. Chúng được định nghĩa như thế này trong 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
Ngoài ra, tệp không tồn tại chỉ là một trong một số vấn đề tiềm ẩn mà chương trình của bạn có thể đã đọc tệp, chẳng hạn như sự cố về quyền, kích thước tệp hoặc nhiều vấn đề khác mà bạn thậm chí không muốn thử xử lý mã mỗi một trong số họ. Tốt nhất là cứ cho rằng tất cả đều đúng và bắt và in, hoặc xử lý, một ngoại lệ nếu có gì đó không ổn, ngoài ra, tại thời điểm này, bạn không thực sự có lựa chọn nào.
Dưới đây là những bài viết của tôi:
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
}