Подтвердить что ты не робот

Декодирование Void с помощью Swift 4s Decodable

У меня есть общий запрос REST:

struct Request<T> {…}

T - тип возвращаемого запроса, например:

struct Animal {…}
let animalRequest = Request<Animal>
let animal: Animal = sendRequest(animalRequest)

Теперь я хотел бы выразить, что общий тип должен соответствовать Decodable чтобы я мог декодировать ответ JSON с сервера:

struct Request<T> where T: Decodable {…}
struct Animal: Decodable {…}

Это имеет смысл и работает - пока я не получаю запрос, который не имеет ответа, Request<Void>. Компилятор не доволен этим:

Type 'Void' does not conform to protocol 'Decodable'

Моя неоднозначная попытка решить эту проблему путем добавления Decodable соответствия Void была быстро обнаружена компилятором:

extension Void: Decodable {…} // Error: Non-nominal type 'Void' cannot be extended

Правильно иметь запрос по типу возврата. Есть ли способ заставить его работать с типами возврата Void? (Например, запросы, которые просто создают что-то на сервере и ничего не возвращают.)

4b9b3361

Ответ 1

Простой обходной путь - ввести пользовательский тип "без ответа", который заменит Void:

struct NoReply: Decodable {}

Соответствие Void - Decodable невозможно. Void - это просто псевдоним типа для пустого кортежа, (), и в данный момент кортежи не могут соответствовать протоколам, но в конечном итоге они будут соответствовать.