如何将这些数据写入我的 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(这是一个日期键控数字字典)到它的末尾。相反,您需要从 datevalue 创建一个数组,并将该数组附加到字典中的相关项目。所以,而不是:

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? - 斯威夫特的主要内容,如果未能解决你的问题,请参考以下文章

如何在 plist 中写入数据?

如何成功写入plist?

读取/写入 plist 的正确方法是啥?

将数据写入 .plist

将 NSDictionary 写入我的应用程序包中的 plist

如何清除在 Xcode 中创建的 plist 中的数据?