2017-03-11 3 views
0

Ich versuche, eine Datei namens Data.plist zu verwenden, um einige einfache unstrukturierte Daten zu speichern, und ich legte diese Datei in den Stammordner meiner App. Um das Lesen/Schreiben in diese Datei zu vereinfachen, habe ich folgendes DataManager struct erstellt. Es kann Data.plist-Datei ohne Problem lesen, aber es kann keine Daten in die Datei schreiben. Ich bin mir nicht sicher, wo das Problem liegt. Könnte irgendjemand herausfinden, wo es falsch liegen könnte?Swift 3: kann keine Daten in PLIST-Datei schreiben

struct DataManager { 

    static var shared = DataManager()   

    var dataFilePath: String? {   
     return Bundle.main.path(forResource: "Data", ofType: "plist") 
    } 

    var dict: NSMutableDictionary? { 
     guard let filePath = self.dataFilePath else { return nil } 
     return NSMutableDictionary(contentsOfFile: filePath) 
    } 

    let fileManager = FileManager.default 

    fileprivate init() { 

     guard let path = dataFilePath else { return } 
     guard fileManager.fileExists(atPath: path) else { 
      fileManager.createFile(atPath: path, contents: nil, attributes: nil) // create the file 
      print("created Data.plist file successfully") 
      return 
     } 
    } 

    func save(_ value: Any, for key: String) -> Bool { 
     guard let dict = dict else { return false } 

     dict.setObject(value, forKey: key as NSCopying) 
     dict.write(toFile: dataFilePath!, atomically: true) 

     // confirm 
     let resultDict = NSMutableDictionary(contentsOfFile: dataFilePath!) 
     print("saving, dict: \(resultDict)") // I can see this is working 

     return true 
    } 

    func delete(key: String) -> Bool { 
     guard let dict = dict else { return false } 
     dict.removeObject(forKey: key) 
     return true 
    } 

    func retrieve(for key: String) -> Any? { 
     guard let dict = dict else { return false } 

     return dict.object(forKey: key) 
    } 
} 

Antwort

1

Sie können die Dateien in Ihrem App-Bundle nicht ändern. So sind alle Dateien, die Sie mit Bundle.main.path(forResource:ofType:) erhalten, lesbar, aber nicht beschreibbar.

Wenn Sie diese Datei ändern möchten, müssen Sie sie zuerst in das Dokumentenverzeichnis Ihrer App kopieren.

let initialFileURL = URL(fileURLWithPath: Bundle.main.path(forResource: "Data", ofType: "plist")!) 
let documentDirectoryURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last! 
let writableFileURL = documentDirectoryURL.appendingPathComponent("Data.plist", isDirectory: false) 

do { 
    try FileManager.default.copyItem(at: initialFileURL, to: writableFileURL) 
} catch { 
    print("Copying file failed with error : \(error)") 
} 

// You can modify the file at writableFileURL 
+0

Danke, es funktioniert jetzt im Dokumentenverzeichnis. Ich bin nur dumm! : D – TonyGW

Verwandte Themen