İşlev örneğinde, (read | write) DocumentsFromFile (...), bazı işlev sarmalayıcılarına sahip olmak kesinlikle mantıklı görünmektedir, çünkü OSx ve iOS'taki her şeyin üç veya dört ana sınıfa başlatılması ve yapılandırılmış, bağlantılı, somutlaştırılmış ve 182 ülkede sadece bir dosyaya "Merhaba" yazmak üzere ayarlanmıştır.
Ancak, bu örnekler gerçek bir programda kullanılacak kadar tam değildir. Yazma işlevi, dosyaya yazma veya dosyaya yazma hatası bildirmez. Okunduğumda, dosyanın okunan verileri içermesi gereken dize olarak var olmayan bir hata döndürmenin iyi bir fikir olduğunu düşünmüyorum. Başarısız olduğunu ve neden, bir istisna gibi bazı bildirim mekanizması aracılığıyla bilmek istersiniz. Daha sonra, sorunun ne olduğunu ortaya çıkaran ve kullanıcının sorunu düzeltmesine izin veren bir kod yazabilir veya programı o noktada "doğru şekilde" kırabilir.
İçinde "Hata dosyası yok" olan bir dize döndürmek istemezsiniz. Sonra, her seferinde işlev çağırma dize hatası aramak ve orada işlemek gerekir. Ayrıca, hata dizesinin gerçek bir dosyadan gerçekten okunup okunmadığını veya kodunuzdan üretilip üretilmediğini gerçekten anlayamazsınız.
NSString (contentOfFile ...) bir istisna fırlattığından, hızlı 2.2 ve Xcode 7.3'te okumayı böyle çağıramazsınız. Yakalamak ve onunla bir şey yapmak, örneğin stdout'a yazdırmak veya daha iyisi, bir hata açılır penceresi veya stderr gibi bir kodunuz yoksa, derleme zamanı hatasıdır. Apple'ın deneme yakalama ve istisnalardan uzaklaştığını duydum, ancak uzun bir hareket olacak ve bu olmadan kod yazmak mümkün değil. Nerede & hata argümanı, belki de eski bir sürüm geliyor bilmiyorum, ancak NSString.writeTo [Dosya | URL] şu anda bir NSError argümanı yok. NSString.h dosyasında şöyle tanımlanırlar:
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
Ayrıca, mevcut olmayan dosya, programınızın bir dosyayı okumada olabilecek bir izin sorunu, dosya boyutu veya bir işleyiciyi kodlamayı denemek istemeyeceğiniz diğer birçok sorundan yalnızca biridir. onların her biri. Her şeyin doğru olduğunu varsaymak ve yakalamak ve yazdırmak ya da bir şey yanlış giderse bir istisna kabul etmek en iyisidir, bunun yanı sıra, bu noktada, zaten bir seçeneğiniz yoktur.
İşte yeniden yazdıklarım:
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
}