繁体   English   中英

如何使用NSCoding在Swift中使用NSUserDefaults将自定义对象保存到数组?

[英]How to use NSCoding to Save Custom Object to Array with NSUserDefaults in Swift?

我有一个自定义对象(它是字符串的字典),当用户点击按钮时会创建一个。

创建此对象时,我正在使用以下代码添加然后将其存储在数组中:

    createdObjectsArray.append(createdObject) // Append the object to the array
NSUserDefaults.standardUserDefaults().setObject(NSKeyedArchiver.archivedDataWithRootObject(createdObjectsArray), forKey: "createdObjectsArray")
            NSUserDefaults.standardUserDefaults().synchronize()

我已声明createdObjectsArray为:

var createdObjectsArray = NSUserDefaults.standardUserDefaults().objectForKey("createdObjectsArray") as? [CustomObject] ?? [CustomObject]()

但是,我的保存数组的代码似乎不起作用,因为在iOS上完全关闭应用程序时,数组中包含的元素数为0。

参见下面我的CustomObject声明:

class CustomObject : NSObject, NSCoding {

    var objectName: String?
    var objectColour: String?
    var objectWeight: String?

    init(json: NSDictionary) { // Dictionary object
        self.objectName = json["objectName"] as? String
        self.objectColour = json["objectColour"] as? String
        self.objectWeight = json["objectWeight"] as? String
    }

    required init?(coder aDecoder: NSCoder) {

        self.objectName = aDecoder.decodeObjectForKey("objectName") as? String;
        self.objectColour = aDecoder.decodeObjectForKey("objectColour") as? String;
        self.objectWeight = aDecoder.decodeObjectForKey("objectWeight") as? String;
    }

    func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(self.objectName, forKey: "objectName");
        aCoder.encodeObject(self.objectColour, forKey: "objectColour");
        aCoder.encodeObject(self.objectWeight, forKey: "objectWeight");
    }
}

将项目添加到此数组时,实际上并没有输出任何错误消息到控制台,相反, createdObjectsArray只是空白。 我怀疑问题是对象的原始声明还是将项目保存到数组的方式(只需将其附加)。

您不能将自定义对象的数组存储到NSUserDefaults

我认为最适合您的选择是使用NSKeyedArchiver将您的数组转换为NSData ,并将此数据存储在NSUserDefaults

一些代码为您:

let array: [CustomObject] = [...]
let data = NSKeyedArchiver.archivedDataWithRootObject(array)
createdObjectsArray.setObject(data, forKey: "createdObjectsArray")

读取数据:

if let savedData = createdObjectsArray.objectForKey("createdObjectsArray") as? NSData {
    if let array = NSKeyedUnarchiver.unarchiveObjectWithData(savedData) as? [CustomObject] {
        // do something…
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM