【问题标题】:How to unarchive custom array with NSUserDefaults?如何使用 NSUserDefaults 取消归档自定义数组?
【发布时间】:2015-05-17 09:52:02
【问题描述】:

我将 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 投射?到 [A 类]。有什么想法应该怎么做?

【问题讨论】:

    标签: xcode swift nsuserdefaults nscoder


    【解决方案1】:

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

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

    【讨论】:

    • 没有更多错误。当我尝试通过调试器查看 classAunpacked 时,它只是一个内存地址。我看不到任何数组项。有什么方法可以查看吗?另外,我检查了 /CoreSimulator/Devices/{someid}/data/library/preferences 但我看到的只是 com.apple.UIAutomation.plist。我正在其他地方修改 plist 吗?
    • 你应该使用 nsuserdefaults 方法 dataForKey developer.apple.com/library/mac/documentation/Cocoa/Reference/…:
    • @LeonardoSavioDabus:太好了!这很好用。此外,虽然我在调试器中看不到整个数组,但我可以使用“po classAunpacked[0].description”来查看每个元素。感谢大卫的精彩回答。
    • 您知道保存数据的 plist 文件的位置和名称吗?
    • 您不应该尝试手动编辑这些 plist。您可以使用 removeObjectForKey 并重置/删除任何值
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2018-12-31
    相关资源
    最近更新 更多