Я пытаюсь сделать что-то нестандартное с моими Codable
объектами.Мои объекты JSON используют несколько типов токенов, поэтому я хотел бы сделать их безопасными.Для этого я создал следующие классы Codable:
class Token: Codable {
let value: String
init(_ value: String = "") {
self.value = value
}
required init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
value = try container.decode(String.self)
}
func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
try container.encode(value)
}
}
extension Token: Equatable { }
extension Token: Hashable { }
class UserToken: Token { }
class ProductToken: Token { }
// etc...
struct User: Codable {
let token: UserToken
let friends: [UserToken : User]
// ...
}
Объекты JSON:
// User
{
"token":"12345",
...
}
Это прекрасно работает, за исключением случая, когда эти токены используются в качестве ключей всловарь, подобный так:
// User
{
"token":"12345",
"friends":{
"56789":{ // User
"token":"56789",
...
},
"09876":{ // User
"token":"09876",
...
}
}
}
Чтобы это работало, я обновил свой класс Token
, чтобы он соответствовал CodingKey
(кажется, это правильно):
class Token: Codable, CodingKey {
var stringValue: String {
return value
}
var intValue: Int? {
return Int(value)
}
required init?(stringValue: String) {
value = stringValue
}
required init?(intValue: Int) {
value = "\(intValue)"
}
// Plus above implementation
}
Это, кажется, не работает должным образом, из-за следующей ошибки.Похоже, JSONDecoder считает, что он должен декодировать массив вместо словаря ... Это ошибка в Codable?
typeMismatch(Swift.Array<Any>, Swift.DecodingError.Context(codingPath: [], debugDescription: "Expected to decode Array<Any> but found a dictionary instead.", underlyingError: nil))