gpt4 book ai didi

swift 3 : [String: AnyObject] using NSCoding protocol to save with NSUserDefaults

转载 作者:行者123 更新时间:2023-11-28 08:26:49 25 4
gpt4 key购买 nike

我有我的自定义类:

private class PendingRequest : NSObject, NSCoding
{
var route : String!
var params: [String: AnyObject]!

init(route: String, params: [String: AnyObject])
{
self.route = route
self.params = params
}
required init(coder aDecoder: NSCoder)
{
self.route = aDecoder.decodeObject(forKey: "route") as! String
self.params = aDecoder.decodeObject(forKey: "params") as! [String: AnyObject]
}

public func encode(with coder: NSCoder)
{
coder.encode(route, forKey: "route")
coder.encode(params, forKey: "params")
}
}

下面是我如何保存我的 PendingRequest 列表:

private static func savePendingRequests(requestsToSend: [PendingRequest])
{
let data = NSKeyedArchiver.archivedData(withRootObject: requestsToSend!)
UserDefaults.standard.set(data, forKey: self.requestsToSendDefaultsString)
}

下面是我尝试检索它的方法:

let data = UserDefaults.standard.data(forKey: requestsToSendDefaultsString)
let requests = NSKeyedUnarchiver.unarchiveObject(with: data!) as! [PendingRequest]
return requests

但是我的代码在检索我的数据时崩溃了……保存工作正常,但无法检索……有什么想法吗?

编辑:这是我的 Crashlytics 错误:

*** -[NSKeyedUnarchiver decodeObjectForKey:]: 无法为 key (NS.objects) 解码类 (_TtCC6Versus9VersusAPIP33_8D2B8AA415FDC4F8DFAF29D7ECE33C1F14PendingRequest) 的对象;该类可能在源代码或未链接的库中定义

解决方案:

我的类 PendingRequestfileprivate,因此 NSKeyedUnarchiver 无法访问它,因此崩溃...感谢您的帮助。

最佳答案

有些事情是不正确的

你忘记在初始化器中调用 super.init()

init(route: String, params: [String: AnyObject])
{
self.route = route
self.params = params
super.init()
}
required init(coder aDecoder: NSCoder)
{
self.route = aDecoder.decodeObject(forKey: "route") as? String
self.params = aDecoder.decodeObject(forKey: "params") as? [String: AnyObject]


// Check if route and params are what you expected here


super.init()
}

你有一个调用“self”的静态方法,我不确定这是否有效,你仍然可以有一个静态键或一个全局键。另外,您正在展开一个非可选值“requestsToSend”。我认为这会解决问题。

private static func savePendingRequests(requestsToSend:[PendingRequest])
{
let data = NSKeyedArchiver.archivedData(withRootObject: requestsToSend)
UserDefaults.standard.set(data, forKey: "AStaticKey")
}

然后检索应该工作。 (我添加了一些安全检查)

guard let data = UserDefaults.standard.data(forKey: "AStaticKey"), 
let requests = NSKeyedUnarchiver.unarchiveObject(with: data) as? [PendingRequest] else {
return [PendingRequest]()
}
return requests

关于 swift 3 : [String: AnyObject] using NSCoding protocol to save with NSUserDefaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39775362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com