改变plist不起作用

时间:2015-04-11 12:09:34

标签: xcode swift plist

我已编写此代码来更改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以及带整数的元素索引)

2 个答案:

答案 0 :(得分:1)

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

据我所知,您正在检查示例plist中未显示的值,例如&#34; index&#34;或&#34;备份&#34;。看来你正在尝试将字符串转换为&#34;问题&#34;进入字典 - 不知道那将是什么影响。

要注意的一件事是,当你有一个包含可变内容的常量字典,反之亦然,然后开始将一个字符分配给另一个时,事情会产生意想不到的结果。

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

答案 1 :(得分:1)

根本问题是当你写:

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中的功能,现在可以在应用商店中发布。我强烈建议升级到它,因为它有一个很多的功能,使这种代码更容易。