Swift 4: с Codable «общий параметр «T» не может быть выведен»

Я получаю следующую ошибку:

Generic parameter 'T' could not be inferred

на линии: let data = try encoder.encode(obj)

Вот код

import Foundation

struct User: Codable {
    var firstName: String
    var lastName: String
}

let u1 = User(firstName: "Ann", lastName: "A")
let u2 = User(firstName: "Ben", lastName: "B")
let u3 = User(firstName: "Charlie", lastName: "C")
let u4 = User(firstName: "David", lastName: "D")

let a = [u1, u2, u3, u4]

var ret = [[String: Any]]()
for i in 0..<a.count {
        let param = [
            "a" : a[i],
            "b" : 45
            ] as [String : Any]
    ret.append(param)
}


let obj = ["obj": ret]

let encoder = JSONEncoder()
encoder.outputFormatting = .prettyPrinted
let data = try encoder.encode(obj) // This line produces an error
print(String(data: data, encoding: .utf8)!)

Что я делаю не так?


person user1107173    schedule 23.03.2018    source источник
comment
Возможный дубликат: Любой при декодировании JSON с помощью Codable?   -  person SaganRitual    schedule 24.03.2018


Ответы (1)


Это сообщение вводит в заблуждение, настоящая ошибка заключается в том, что obj имеет тип [String: Any], который не соответствует Codable, потому что Any не соответствует.

Если подумать, Any никогда не сможет соответствовать Codable. Что Swift будет использовать для хранения сущности JSON, если это может быть целое число, строка или объект? Вы должны определить правильную структуру для хранения ваших данных.

person Code Different    schedule 23.03.2018
comment
Спасибо. Есть ли способ сделать [String: [String: Any]] кодируемым? - person user1107173; 24.03.2018
comment
Any никогда не сможет соответствовать Codable. Вы должны определить правильную структуру для хранения ваших данных - person Code Different; 24.03.2018