Вот мой сценарий: у меня быстрый сервер WebSocket и клиент Javascript. Через этот же WebSocket я буду отправлять различные объекты, соответствующие разным кодируемым типам. Его достаточно просто расшифровать, если известен правильный тип. Трудность для меня состоит в том, чтобы определить, какой тип отправляется от клиента. Моей первой мыслью было использовать JSON, который выглядит следующим образом:
{type: "GeoMarker",
data: {id: "2",
latitude: "-97.32432"
longitude: "14.35436"}
}
Таким образом, я бы знал, как декодировать data
с помощью let marker = try decoder.decode(GeoMarker.self)
. Это кажется простым, но по какой-то причине я просто не могу понять, как извлечь объект data
как JSON, чтобы я мог декодировать его, используя тип GeoMarker.
Другое решение, которое я придумал, состояло в том, чтобы создать промежуточный тип следующим образом:
struct Communication: Decodable {
let message: String?
let markers: [GeoMarker]?
let layers: [GeoLayer]?
}
Таким образом, я мог бы отправить JSON в следующем формате:
{message: "This is a message",
markers: [{id: "2",
latitude: "-97.32432"
longitude: "14.35436"},
{id: "3",
latitude: "-67.32432"
longitude: "71.35436"}]
}
и используйте let com = try decoder.decode(Communication.self)
и разверните необязательное сообщение, маркеры и переменные слоев. Это работает, но кажется неуклюжим, особенно если мне нужно больше типов. Мне, вероятно, в конечном итоге понадобится 8-10 после того, как все сказано и сделано.
Я думал об этом, но не чувствую, что нашел удовлетворительное решение. Будут ли лучшие подходы? Есть ли стандарт для такого рода вещей, о котором я не знаю?
----РЕДАКТИРОВАТЬ----
В качестве естественного продолжения, как бы вы поступили с кодированием в тот же формат JSON, учитывая те же обстоятельства, что и выше?
type
, который является строкой, иdata
, который может быть любым. То, как вы декодируетеdata
, зависит отtype
. - person Code Different   schedule 19.10.2018