Dalam contoh fungsi, (baca | tulis) DocumentsFromFile (...) memiliki beberapa fungsi pembungkus tampaknya masuk akal karena segala sesuatu di OSx dan iOS tampaknya memerlukan tiga atau empat kelas utama yang dipakai dan banyak properti, dikonfigurasi, dihubungkan, dipakai, dan set, hanya untuk menulis "Hai" ke file, di 182 negara.
Namun, contoh-contoh ini tidak cukup lengkap untuk digunakan dalam program nyata. Fungsi tulis tidak melaporkan kesalahan apa pun yang membuat atau menulis ke file. Saat membaca, saya pikir itu bukan ide yang baik untuk mengembalikan kesalahan bahwa file tidak ada sebagai string yang seharusnya berisi data yang telah dibaca. Anda ingin tahu bahwa itu gagal dan mengapa, melalui beberapa mekanisme pemberitahuan, seperti pengecualian. Kemudian, Anda dapat menulis beberapa kode yang menampilkan apa masalahnya dan memungkinkan pengguna untuk memperbaikinya, atau "dengan benar" merusak program pada saat itu.
Anda tidak ingin hanya mengembalikan string dengan "File kesalahan tidak ada" di dalamnya. Kemudian, Anda harus mencari kesalahan dalam string dari memanggil fungsi setiap kali dan menanganinya di sana. Anda juga mungkin tidak bisa memastikan apakah string kesalahan benar-benar dibaca dari file yang sebenarnya, atau apakah itu dihasilkan dari kode Anda.
Anda bahkan tidak dapat memanggil read seperti ini di swift 2.2 dan Xcode 7.3 karena NSString (contentOfFile ...) melempar pengecualian. Ini adalah kesalahan waktu kompilasi jika Anda tidak memiliki kode untuk menangkapnya dan melakukan sesuatu dengannya, seperti mencetaknya ke stdout, atau lebih baik, jendela sembulan galat, atau stderr. Saya telah mendengar bahwa Apple menjauh dari try catch dan pengecualian, tetapi ini akan menjadi langkah yang panjang dan tidak mungkin untuk menulis kode tanpa ini. Saya tidak tahu dari mana argumen & kesalahan berasal, mungkin versi yang lebih lama, tetapi NSString.writeTo [File | URL] saat ini tidak memiliki argumen NSError. Mereka didefinisikan seperti ini di 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
Selain itu, file yang tidak ada hanyalah salah satu dari sejumlah masalah potensial yang mungkin dimiliki program Anda ketika membaca file, seperti masalah izin, ukuran file, atau berbagai masalah lain yang Anda bahkan tidak ingin mencoba membuat kode penangan untuk masing-masing dari mereka. Yang terbaik adalah menganggap semuanya benar dan menangkap dan mencetak, atau menangani, pengecualian jika ada yang salah, selain itu, pada titik ini, Anda tidak benar-benar punya pilihan.
Inilah penulisan ulang saya:
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
}