传递带有多个泛型类型的枚举作为参数

时间:2015-08-20 20:07:42

标签: swift generics swift2 swift-protocols

我遇到了Swift 2的问题 - XCode版本7.0 beta 5(7A176x)

我有一个包含两种泛型类型的枚举状态。函数printState接受State参数并打印" One"或"两个"基于论点

protocol Protocol1 {
}

struct Struct1: Protocol1 {
}

protocol Protocol2 {
}

struct Struct2: Protocol2 {
}

enum State<T:Protocol1, U:Protocol2> {
  case One(firstStruct: T, secondStruct:U)
  case Two(secondStruct:U)
}

func printState<T:Protocol1, U:Protocol2>(state: State<T,U>) {
  switch state {
  case .One( _):
    print("One")
  case .Two( _):
    print("Two")
  }
}

当我按下面调用printState时。

printState(State.One(firstStruct:Struct1(), secondStruct:Struct2()))
printState(State.Two(secondStruct:Struct2())) // This fails on compilation

第二次调用printState时出现编译错误 -

  

错误:无法调用&#39;两个&#39;使用类型的参数列表   &#39;(secondStruct:Struct2)&#39;   printState(State.Two(secondStruct:Struct2()))

如果T和U被限制为类类型,那么一切正常。但是只有当T和U是协议类型时才会出现此错误。此外,我可以通过使案例2也接受Protocol1来摆脱这个错误,但它并不真正需要它。

为什么我收到此错误?我怎样才能使这个工作,以便案例2只接受Protocol1。

1 个答案:

答案 0 :(得分:0)

问题是编译器无法推断T的类型,因为您只指定了U的类型。因此,您必须明确定义类型:

printState(State<Struct1, Struct2>.Two(secondStruct:Struct2()))