如何使用 NSUserDefaults 取消存档自定义数组?
How to unarchive custom array with NSUserDefaults?
我正在将一个 ClassA 类型的数组保存到 NSUserDefaults。 A 类看起来像这样:
class ClassA :NSObject, NSCoding{
init (descriptionParam: String) {
self.description = descriptionParam
}
var description: String?
required init(coder aDecoder: NSCoder) {
if let description = aDecoder.decodeObjectForKey("description") as? String {
self.description = description
}
}
func encodeWithCoder(aCoder: NSCoder) {
if let description = self.description {
aCoder.encodeObject(description, forKey: "description")
}
}
}
这就是我将数组保存到 NSUserDefaults 的方式:
let myData = NSKeyedArchiver.archivedDataWithRootObject(ClassAManager.classa_array)
userDefaults.setObject(myData, forKey: "classAarray");
我在初始 viewDidLoad() 中执行以下操作:
var classA: AnyObject? = NSUserDefaultsManager.userDefaults.objectForKey("classAarray") as AnyObject?
let classAunpacked = NSKeyedUnarchiver.unarchiveObjectWithData(classA) as [ClassA]
我在上面的第二行(带有 let
的那一行)得到以下编译时错误:
Cannot invoke 'unarchiveObjectWithData' with an argument list of type '(AnyObject?)'
但是,如果我尝试使用 AnyObject 以外的任何其他内容检索数组,我会收到其他编译时错误。似乎我也无法从 AnyObject 投射?到[A级]。知道应该怎么做吗?
unarchiveObjectWithData
将 NSData
作为唯一参数,而不是可选的 AnyObject
。由于 unarchive...
的结果也是可选的,我建议使用:
if let classA = NSUserDefaultsManager.userDefaults.dataForKey("classAarray") {
if let classAunpacked = NSKeyedUnarchiver.unarchiveObjectWithData(classA) as? [ClassA] {
// Use classAunpacked here
}
}
我正在将一个 ClassA 类型的数组保存到 NSUserDefaults。 A 类看起来像这样:
class ClassA :NSObject, NSCoding{
init (descriptionParam: String) {
self.description = descriptionParam
}
var description: String?
required init(coder aDecoder: NSCoder) {
if let description = aDecoder.decodeObjectForKey("description") as? String {
self.description = description
}
}
func encodeWithCoder(aCoder: NSCoder) {
if let description = self.description {
aCoder.encodeObject(description, forKey: "description")
}
}
}
这就是我将数组保存到 NSUserDefaults 的方式:
let myData = NSKeyedArchiver.archivedDataWithRootObject(ClassAManager.classa_array)
userDefaults.setObject(myData, forKey: "classAarray");
我在初始 viewDidLoad() 中执行以下操作:
var classA: AnyObject? = NSUserDefaultsManager.userDefaults.objectForKey("classAarray") as AnyObject?
let classAunpacked = NSKeyedUnarchiver.unarchiveObjectWithData(classA) as [ClassA]
我在上面的第二行(带有 let
的那一行)得到以下编译时错误:
Cannot invoke 'unarchiveObjectWithData' with an argument list of type '(AnyObject?)'
但是,如果我尝试使用 AnyObject 以外的任何其他内容检索数组,我会收到其他编译时错误。似乎我也无法从 AnyObject 投射?到[A级]。知道应该怎么做吗?
unarchiveObjectWithData
将 NSData
作为唯一参数,而不是可选的 AnyObject
。由于 unarchive...
的结果也是可选的,我建议使用:
if let classA = NSUserDefaultsManager.userDefaults.dataForKey("classAarray") {
if let classAunpacked = NSKeyedUnarchiver.unarchiveObjectWithData(classA) as? [ClassA] {
// Use classAunpacked here
}
}