更改 plist 不起作用 swift

Changing plist doesn't work swift

我写了这段代码来更改 plist 文件:

var check = false

    let path = NSBundle.mainBundle().pathForResource("se.feomedia.qkrussia", ofType: "plist")
    let dict = NSMutableDictionary(contentsOfFile : path!)!
    for (key, value) in dict {
        if String(key as NSString).hasPrefix("GAME") {
            for k in dict.objectForKey(key) as Array<NSDictionary> {
                for (g, var d) in k {
                    if String(g as NSString) == "index" {
                        check = true
                    }
                    if String(g as NSString).hasPrefix("backup") || (String(g as NSString).hasPrefix("question") && check) {
                        println(g)
                        let u = d as NSDictionary
                        println(2)
                        for (e, var h) in u {
                            if String(e as NSString).hasPrefix("correct") {
                                h = "someText"
                            }
                        }
                        d = u
                    }
                    else {
                        if String(g as NSString) == "correct" {
                            d = "someText"
                        }
                    }
                }
                check = false
            }
        }
    }
    dict.writeToFile("/Users/nik/Desktop/correct.plist", atomically: true)

plist 文件包含以下内容:

<dict>
<key>CURRENT_USER_ID</key>
<string>6751073888894976</string>
<key>FBAccessTokenInformationKeyUUID</key>
<string>2AB33590-09AC-4B76-9E57-42005E9CF9B7</string>
<key>GAME_4808886523527168</key>
<array>
    <dict>
        <key>cat_id</key>
        <string>19</string>
        <key>cat_name</key>
        <string>Знаменитости и СМИ</string>
        <key>correct</key>
        <string>Макс и Эмме</string>
        <key>q_id</key>
        <integer>6296760553046016</integer>
        <key>question</key>
        <string>Как зовут детей Дженифер Лопез?</string>
        <key>timestamp</key>
        <string>2014-07-28 14:18:18</string>
        <key>wrong1</key>
        <string>Макс и Эббот</string>
        <key>wrong2</key>
        <string>Дженни и Марк</string>
        <key>wrong3</key>
        <string>Селена и Джастин</string>
    </dict>
    <dict>
        <key>cat_id</key>
        <string>19</string>
        <key>cat_name</key>
        <string>Знаменитости и СМИ</string>
        <key>correct</key>
        <string>2008 г.</string>
        <key>q_id</key>
        <integer>4765042876612608</integer>
        <key>question</key>
        <string>В каком году Дима Билан победил на Евровидении?</string>
        <key>timestamp</key>
        <string>2014-07-28 14:18:18</string>
        <key>wrong1</key>
        <string>2006 г.</string>
        <key>wrong2</key>
        <string>2007 г.</string>
        <key>wrong3</key>
        <string>2010 г.</string>
    </dict>
    <dict>
        <key>cat_id</key>
        <string>19</string>
        <key>cat_name</key>
        <string>Знаменитости и СМИ</string>
        <key>correct</key>
        <string>Лампочка</string>
        <key>q_id</key>
        <integer>6690225728258048</integer>
        <key>question</key>
        <string>Любимый объект художника Васи Ложкина на его собственных картинах?</string>
        <key>timestamp</key>
        <string>2015-01-07 12:08:45</string>
        <key>wrong1</key>
        <string>Кот</string>
        <key>wrong2</key>
        <string>Рамка</string>
        <key>wrong3</key>
        <string>Мона Лиза</string>
    </dict>

还有更多。 plist 编写正确,一切正常,从 plist 读取工作完美,但 correct.plist 文件与真实文件完全相同,所以没有任何改变。我不知道为什么这不起作用。

编辑: 字典也可能包含 3 个元素:2 个字典(question 和 backupQuestion 以及带整数的元素索引)

你的代码很难读懂。您使用的是表达价值很小的单字母变量。有很多嵌套逻辑,所以清晰度很重要。

据我所知,您正在检查示例 plist 中未显示的值,例如 "index" 或 "backup"。您似乎正试图将 "question" 下的字符串转换为字典 - 不确定这样做的效果。

需要注意的一件事是,如果您有一个内容可变的常量字典,反之亦然,然后开始将一个字典分配给另一个字典,事情可能会出现意想不到的结果。

我的建议是您从一个全新的结构开始,其中所有内容都是可编辑的(即声明为 var ),然后根据您的业务逻辑从现有数据中设置值。这应该允许您编写更具可读性的代码,并且它应该按预期工作。

根本问题是当你写:

for (g, var d) in k {

您不再通过更改d对字典进行操作。 d 是一个全新的变量,然后您可以为其分配一个新值。它不会更改外部变量,当它在 for 循环结束时超出范围时,任何更改都将被丢弃。

要真正改变字典,最好的策略是取出要改变的元素,修改它,然后替换字典中的值。像这样:

if let path = NSBundle.mainBundle().pathForResource("se.feomedia.qkrussia", ofType: "plist"),
        dict = NSDictionary(contentsOfFile : path)
{
    for (key, value) in dict {
        // note, "var items = " creates a COPY of the values
        if let key = key as? String where key.hasPrefix("GAME"),
            var items = value as? [NSDictionary]
        {
            for idx in indices(items) {
                //perform some logic on each items[idx] value,
                // e.g. checking for things with
                // if items[idx]["index"] != nil, let questionValue = items[idx]["question"]
                // then updating values in-place, e.g.:
                // items[idx]["correct"] = "whatever"
            }
            // then _replace_ the original value in the dictionary
            dict.setValue(items, forKey: key)
        }
    }
    dict.writeToFile("/Users/nik/Desktop/correct.plist", atomically: true)
}

请注意,以上代码依赖于 Swift 1.2 中的功能,该版本现已在应用商店中发布用于生产。我强烈建议升级到它,因为它具有 很多 的功能,可以使此类代码更容易。