我已编写此代码来更改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以及带整数的元素索引)
答案 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中的功能,现在可以在应用商店中发布。我强烈建议升级到它,因为它有一个很多的功能,使这种代码更容易。