【发布时间】:2017-11-24 11:18:39
【问题描述】:
我的应用程序有一个本地缓存,并从/向服务器发送/接收模型。所以我决定构建一个地图 [String : Codable.Type],本质上是为了能够解码我在这个通用缓存上的任何东西,无论是在本地创建的还是从服务器接收的。
let encoder = JSONEncoder()
let decoder = JSONDecoder()
var modelNameToType = [String : Codable.Type]()
modelNameToType = ["ContactModel": ContactModel.Self, "AnythingModel" : AnythingModel.Self, ...]
无论我在应用程序上创建什么,我都可以成功编码并像这样存储在缓存中:
let contact = ContactModel(name: "John")
let data = try! encoder.encode(contact)
CRUD.shared.storekey(key: "ContactModel$10", contact)
我想这样解码:
let result = try! decoder.decode(modelNameToType["ContactModel"]!, from: data)
但我得到了错误:
不能使用类型参数列表调用“解码”(Codable.Type, 来自:数据)
我做错了什么?任何帮助表示赞赏
修复类型有效,并解决任何本地请求,但不是远程请求。
let result = try! decoder.decode(ContactModel.self, from: data)
联系模特:
struct ContactModel: Codable {
var name : String
}
对于远程请求,我会有这样的功能:
func buildAnswer(keys: [String]) -> Data {
var result = [String:Codable]()
for key in keys {
let data = CRUD.shared.restoreKey(key: key)
let item = try decoder.decode(modelNameToType[key]!, from: data)
result[key] = item
}
return try encoder.encode(result)
}
...如果我解决了解码问题。任何帮助表示赞赏。
【问题讨论】:
-
这个“decoder.decode(ContactModel.self, from: data)”怎么还是不行?这个看起来是对的。请同时发布您的 ContactModel 类定义。
-
我只是说 decoder.decode(ContactModel.self, from: data) 确实有效!
-
当您说“动态”时,您希望
result是什么类型? (它必须是编译时的特定类型。它不能是“在运行时的任何类型。”如果它是“一些在编译时未知的随机类型”你可以调用什么方法换句话说,使用result的下一行代码是什么?) -
这个应用程序有一个本地缓存,并且经常接收和发送信息到服务器。我将按照您的建议更新问题以具有整个功能
-
这与question密切相关