Swift(4)无法转换为通用基类吗?

时间:2018-09-18 11:21:46

标签: swift generics swift4

在Swift中,如果我声明一个基于泛型的类:

class BasicRequest<T>{
}

class StartRequest: BasicRequest<BasicPayload> {
}

然后尝试使用通用方法:

class SocketClient {

  public func send(request: BasicRequest<Any>){
  }
}

它不能编译:

SocketClient.shared.send(request: StartRequest()) 

有消息

  

无法将类型“ StartRequest”的值转换为预期参数   输入“ BasicRequest”

为什么呢?类型信息应该在整个继承链中都可用。

1 个答案:

答案 0 :(得分:2)

在Swift中泛型是不变的,在您的情况下,这意味着BasicRequest<Any>BasicRequest<BasicPayload>不兼容,即使BasicPayloadAny也不兼容。这就是不变式的工作方式,在这个方向上您几乎无能为力。

您可以做的是使send通用,从而允许传递任何种类的BasicRequest实例:

public func send<T>(request: BasicRequest<T>){
}