Écrire dans un fichier plist dans Swift

J'ai un échantillon plist-fichier, favCities.plist. C'est mon exemple de code:

 override func viewDidLoad() {
    super.viewDidLoad()


    let path = NSBundle.mainBundle().pathForResource("favCities", ofType: "plist")
    var plistArray = NSArray(contentsOfFile: path) as [Dictionary<String, String>]

    var addDic: Dictionary = ["ZMV": "TEST", "Name": "TEST", "Country": "TEST"]
    plistArray += addDic
    (plistArray as NSArray).writeToFile(path, atomically: true)

    var plistArray2 = NSArray(contentsOfFile: path)

    for tempDict1 in plistArray2 {
        var tempDict2: NSDictionary = tempDict1 as NSDictionary
        var cityName: String = tempDict2.valueForKey("Name") as String
        var cityZMV: String = tempDict2.valueForKey("ZMV") as String
        var cityCountry: String = tempDict2.valueForKey("Country") as String
        println("City: \(cityName), ZMV: \(cityZMV), Country: \(cityCountry)")
    }

Au premier coup d'œil, tout fonctionne bien. La sortie ressemble à ceci:

City: Moscow, ZMV: 00000.1.27612, Country: RU
City: New York, ZMV: 10001.5.99999, Country: US
City: TEST, ZMV: TEST, Country: TEST

Mais quand je l'interruption de l'application, je vois que mon fichier favCities.plist n'a pas changé. Il y a encore deux valeurs. Ces valeurs - City: TEST, ZMV: TEST, Country: TEST - n'ont pas été ajoutés. Si j'ai redémarré l'application, puis de nouveau je vois 3 lignes de sortie, mais il faudrait être 4.

Quel est le problème?

Mise à JOUR:

J'ai été changé de code:

override func viewDidLoad() {
super.viewDidLoad()
let fileManager = (NSFileManager.defaultManager())
let directorys : [String]? = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory,NSSearchPathDomainMask.AllDomainsMask, true) as? [String]
if (directorys! != nil){
let directories:[String] = directorys!;
let dictionary = directories[0];
let plistfile = "favCities.plist"
let plistpath = dictionary.stringByAppendingPathComponent(plistfile);
println("\(plistpath)")
var plistArray = NSArray(contentsOfFile: plistpath) as [Dictionary<String, String>]
var addDic: Dictionary = ["ZMV": "TEST", "Name": "TEST", "Country": "TEST"]
plistArray += addDic
(plistArray as NSArray).writeToFile(plistpath, atomically: false)
var plistArray2 = NSArray(contentsOfFile: plistpath)
for tempDict1 in plistArray2 {
var tempDict2: NSDictionary = tempDict1 as NSDictionary
var cityName: String = tempDict2.valueForKey("Name") as String
var cityZMV: String = tempDict2.valueForKey("ZMV") as String
var cityCountry: String = tempDict2.valueForKey("Country") as String
println("City: \(cityName), ZMV: \(cityZMV), Country: \(cityCountry)")
}
}
else {
println("ERROR!")
}
}

Maintenant, lorsque vous exécutez l'application, le nombre de lignes de la hausse de la production:

City: Moscow, ZMV: 00000.1.27612, Country: RU
City: New York, ZMV: 10001.5.99999, Country: US
City: TEST, ZMV: TEST, Country: TEST
City: TEST, ZMV: TEST, Country: TEST
........

MAIS! Si l'option afficher le fichier favCities.plist qui se trouve dans le dossier du projet (Project Navigator dans Xcode), il reste inchangé - il y a deux lignes!

Si marcher le long du chemin, qui est stocké dans la variable plistpath - /Users/admin/Library/Developer/CoreSimulator/Devices/55FD9B7F-78F6-47E2-9874-AF30A21CD4A6/data/Containers/Data/Application/DEE6C3C8-6A44-4255-9A87-2CEF6082A63A/Documents/

Puis il y a un autre fichier favCities.plist. Il contient toutes les modifications qui en font la demande. Ce que je fais mal? Comment puis-je voir tous les changements dans un fichier qui se trouve dans le dossier du projet (Project Navigator)?

vérifier la valeur de retour de writeToFile, et vous verrez qu'elle a échoué. parce que les fichiers dans les principales bundle sont en lecture seule
double possible de l'écriture NSDictionary à plist dans mon app bundle
(Donc, toutes les erreurs typiques dans les applications iOS qui ont été faites à l'aide Objective-C, le sont maintenant à nouveau en utilisant Swift 🙂
Ou plist-les fichiers dans le dossier du projet besoins que pour la première utilisation (comme les propriétés, etc.)?

OriginalL'auteur Alexey Nakhimov | 2014-07-11