如何使用NSUserDefaults解压缩自定义数组?

时间:2015-03-15 04:27:07

标签: xcode swift nsuserdefaults nscoder

我正在将类型ClassA的数组保存到NSUserDefaults。 ClassA看起来像这样:

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转换出来?至[ClassA]。有什么想法应该怎么做?

1 个答案:

答案 0 :(得分:1)

unarchiveObjectWithDataNSData为唯一参数,而非可选AnyObject。由于unarchive...的结果也是可选的,我建议使用:

if let classA = NSUserDefaultsManager.userDefaults.dataForKey("classAarray") {
    if let classAunpacked = NSKeyedUnarchiver.unarchiveObjectWithData(classA) as? [ClassA] {
        // Use classAunpacked here
    }
}
相关问题