Swift 如何使用 NSCoding 将自定义对象保存到带有 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…
}
}
我有一个自定义对象(它是一个字符串字典),它是在用户点击按钮时创建的。
创建此对象时,我使用以下代码添加并将其存储在数组中:
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…
}
}