Я использую новый протокол Codable, чтобы преобразовать структуру в JSON, а затем в словарь для целей тестирования. Проблема в том, что переменная словаря внутри структуры не преобразуется обратно и остается Any
, а не [Int: String]
.
struct Person: Codable {
var name: String?
var history: [Int: String]
init() {
self.name = "Name"
history = [0: "Test"]
}
}
let person = Person()
let jsonData = try JSONEncoder().encode(person)
let result = try JSONSerialization.jsonObject(with: jsonData, options: [])
let dictionary = result as? [String: Any]
print(dictionary)
Это дает мне следующий результат
Optional(["history": {
0 = Test;
}, "name": Name])
Когда я ожидал
Optional(["history":[0: "Test"]], "name": "Test"])
Я был бы признателен за любое объяснение того, почему это происходит, или, что еще лучше, за решение, как в основном выполнять глубокую сериализацию JSON.
Я добавляю игровую площадку, демонстрирующую проблему: https://www.dropbox.com/s/igpntk7az0hevze/JSONSerialisation.playground.zip
[Int: String]
- это не массив, это словарь, а{0 = Test;}
- это то, как Swift форматирует словарь, когда вы печатаете его на консоли для отладки... Мне кажется, что ваш код работает нормально. - person donnywals   schedule 19.07.2017let sampleDictionary: [String: Any] = ["history":[0: "Test"], "name": "Test"]
, а затем печатаю егоprint(sampleDictionary)
, результатом будет["history": [0: "Test"], "name": "Test"]
. И если я попытаюсь получить доступ к истории с помощьюlet history = dictionary["history"] as? [Int: String]
, значение будет равно нулю, потому что это не словарь. - person Denis Balko   schedule 19.07.2017