如何将这些数据写入我的 Plist? - 斯威夫特
Posted
技术标签:
【中文标题】如何将这些数据写入我的 Plist? - 斯威夫特【英文标题】:How do I write this data into my Plist? - Swift 【发布时间】:2014-12-15 23:41:26 【问题描述】:我非常接近将新数据写回到我的 UserData.plist 中,但是我在正确创建新数据的字典以便它可以写出时遇到了问题。
func saveTriggerData()
//get current date
let date = NSDate()
//for each trigger, insert date,value
for (index,trigger) in enumerate(triggersList)
//if trigger already exists in userData, just add a new date, value
if(triggersData[trigger] != nil)
NSLog("Trigger " + trigger + " exists")
//get value of corresponding stepper
var value = Int(steppersList[index].value)
//get previous data for this trigger
//make a dictionary of new data
var newData: [NSDate: NSNumber] = [date: value]
triggersData.addEntriesFromDictionary(newData)
//insert new data
let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as NSArray
let documentsDirectory = paths.objectAtIndex(0) as NSString
let path = NSBundle.mainBundle().pathForResource("UserData", ofType: "plist")
//replace dict's Triggers value with our new Triggers
NSLog("\(userData)")
//userData.setObject(triggersData, forKey:"Triggers")
//let fileWritten = userData.writeToFile(path!, atomically: true)
//NSLog("Save trigger data: \(fileWritten)")
else //trigger does not yes exist in userData, add trigger name and then its date, value
NSLog("Trigger " + trigger + " does not yet exist")
结果:
Triggers =
"Caffeinated Drinks" = (
(
"2014-12-03 16:30:22 +0000",
2
),
(
"2014-12-04 16:30:02 +0000",
1
)
);
"Alcoholic Drinks" = (
(
"2014-12-03 16:28:53 +0000",
3
),
(
"2014-12-04 16:29:33 +0000",
0
)
);
"2014-12-15 23:36:53 +0000" = 0;
;
最后一行 "2014-12-15 23:36:53 +0000" = 0; 应该是酒精饮料的子级。所以,我已经接近了,但我还没有完全到达那里,我为此而发疯。任何帮助将不胜感激。
哦,还有 plist:
<key>Triggers</key>
<dict>
<key>Alcoholic Drinks</key>
<array>
<array>
<date>2014-12-03T16:28:53Z</date>
<integer>3</integer>
</array>
<array>
<date>2014-12-04T16:29:33Z</date>
<integer>0</integer>
</array>
</array>
<key>Caffeinated Drinks</key>
<array>
<array>
<date>2014-12-03T16:30:22Z</date>
<integer>2</integer>
</array>
<array>
<date>2014-12-04T16:30:02Z</date>
<integer>1</integer>
</array>
</array>
</dict>
【问题讨论】:
【参考方案1】:您的triggersData
是一个包含数组数组的字典。您当前正在添加newData
(这是一个日期键控数字字典)到它的末尾。相反,您需要从 date
和 value
创建一个数组,并将该数组附加到字典中的相关项目。所以,而不是:
var newData: [NSDate: NSNumber] = [date: value]
triggersData.addEntriesFromDictionary(newData)
尝试:
var newData : [AnyObject] = [date, value]
if var triggerArray = triggersData[trigger] as? [AnyObject]
triggerArray.append(newData)
triggersData[trigger] = triggerArray
这将使数据与您的 plist 格式相同。但如果我是你,我会重组你的 plist - 最低级别的数组必须是 [AnyObject],因为第一项是 NSDate 类型,而第二项是 NSNumber 类型,这是个坏主意。
【讨论】:
感谢您的帮助!但是,我在第二行收到错误“'AnyObject' 不可转换为 [[AnyObject]]”。 我推断 triggersData 是 [String: [[AnyObject]]],但该错误暗示它是 [String:AnyObject]。我会相应地修改我的答案。以上是关于如何将这些数据写入我的 Plist? - 斯威夫特的主要内容,如果未能解决你的问题,请参考以下文章