Вот мой сценарий: у меня есть быстрый сервер 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, учитывая те же обстоятельства выше?