也许社区中的某些人有类似的困难,并提出了一个可行的解决方案.
我们目前正在开发一个多语言键/值存储.鉴于此,我们通常不知道提前存储的内容.
考虑以下结构
struct Character : Codable, Equatable {
let name: String
let age: Int
let gender: Gender
let hobbies: [String]
static func ==(lhs: Character, rhs: Character) -> Bool {
return (lhs.name == rhs.name
&& lhs.age == rhs.age
&& lhs.gender == rhs.gender
&& lhs.hobbies == rhs.hobbies)
}
}
Run Code Online (Sandbox Code Playgroud)
通过线路发送/接收字符实体时,一切都非常简单.用户可以向我们提供我们可以解码的类型.
但是,我们确实能够动态查询存储在后端中的实体.例如,我们可以请求'name'属性的值并返回该值.
这种活力是一个痛点.除了不知道它们是Codable之外的属性类型之外,返回的格式也可以是动态的.
以下是两个不同调用提取属性的响应示例:
{"value":"Bilbo"}
Run Code Online (Sandbox Code Playgroud)
和
{"value":["[Ljava.lang.Object;",["Bilbo",111]]}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,它可能相当于字典.
现在,我有以下结构来处理响应:
fileprivate struct ScalarValue<T: Decodable> : Decodable {
var value: T?
}
Run Code Online (Sandbox Code Playgroud)
使用Character示例,传递给解码器的类型将是:
ScalarValue<Character>.self
Run Code Online (Sandbox Code Playgroud)
但是,对于单值,数组或字典情况,我有点卡住了.
我从一开始就开始:
fileprivate struct AnyDecodable: Decodable {
init(from decoder: Decoder) …Run Code Online (Sandbox Code Playgroud)