【发布时间】:2018-01-19 23:03:20
【问题描述】:
我有一个通用的 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 返回类型一起工作? (例如,只是在服务器上创建一些东西而不返回任何东西的请求。)
【问题讨论】:
-
也许我误解了这个问题,但这取决于你 - 开发者 - 来处理 avoiding
Void请求跨度> -
我能理解你的观点,但同时感觉如果一个事物在 x 上是通用的,那么
Void又名零元组()应该是 x 的有效值。毕竟Equatable和Decodable是微不足道的。 -
@zoul 仍然想知道
Request<Void>应该是什么意思。你为什么要使用这样的东西?如果那是响应类型,则永远不会是Void。它可以是空的,但绝不是Void。 -
empty 和
Void有什么区别?对我来说,在普通函数中有一个完美的类比,返回Void的请求与返回Void的函数相同。两者都只用于副作用。