我有一个通用的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'
我的调皮尝试通过为
Void
添加Decodable
符合性来解决这个问题,但编译器很快就发现了它的问题。extension Void: Decodable {…} // Error: Non-nominal type 'Void' cannot be extended
请求的返回类型应该是通用的,这种做法是正确的。是否有一种方法可以使其与Void
返回类型一起工作?(例如仅在服务器上创建某些内容且无需返回任何内容的请求。)
Void
,也就是零元组()
, 应该是_x_的有效值。毕竟它是微不足道的Equatable
和Decodable
。 - zoulRequest<Void>
意味着什么。为什么要使用这样的东西?如果这是一个响应类型,它从来不会是Void
。它可以为空,但从来不是Void
。 - SulthanVoid
之间有什么区别?对我来说,在普通函数中有一个很好的类比,返回Void
的请求就像返回Void
的函数一样。两者都仅用于副作用。 - zoul