1

Swift 2 に問題があります - XCode バージョン 7.0 ベータ 5 (7A176x)

2 つのジェネリック型を持つ enum State があります。関数printStateは State 引数を取り、引数に基づいて「One」または「Two」を出力します

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 の 2 回目の呼び出しでコンパイル エラーが発生する -

エラー: タイプ '(secondStruct: Struct2)' の引数リストで 'Two' を呼び出せません printState(State.Two(secondStruct:Struct2()))

T と U がクラス型に制約されている場合、すべてが正常に機能します。しかし、T と U がプロトコル タイプの場合にのみ、このエラーが発生します。また、case Two も Protocol1 を受け入れるようにすることで、このエラーを取り除くことができますが、実際には必要ありません。

このエラーが発生するのはなぜですか? ケース 2 が Protocol1 のみを受け入れるようにするには、どうすればこれを機能させることができますか。

4

1 に答える 1

0

T問題は、 の型のみを指定するため、コンパイラが の型を推測できないことですU。したがって、タイプを明示的に定義する必要があります。

printState(State<Struct1, Struct2>.Two(secondStruct:Struct2()))
于 2015-08-20T21:31:53.193 に答える