2017-07-10 5 views
1

Swiftジェネリックスは、コードが特殊化されインスタンス化時に生成されるC++テンプレートと似ていませんが、次のコードを特殊化する方法があります。特にSwiftジェネリックと特殊化

func X1<R>(i: R) { 
    print("R") 
} 

func X1(i: Int) { 
    print("Int") 
} 

func X2<R>(i: R) { 
    X1(i: i) 
} 

X2(i: "s") 
X2(i: 1) 
X1(i: "s") 
X1(i: 1) 

、私が見出力は次のようになります。

R 
R 
R 
Int 

しかし、私は本当にINTはX1のIntに特化するためのX1へX2コールをしたい:

R 
Int 
R 
Int 

私が知っています私は型としてIntを持つ別のX2を作成することでそれを行うことができますが、私はそれを避けることを望んでいました。 、それは私が専門的な種類の多くがあるかもしれないとして避けるためにしようとしているものだ -

EDIT回答の数は、特殊なタイプごとに処理を追加することを示唆している(すなわち、func X2(i: Int)かやっ型キャストlet x = i as? Intを追加)例えば:

func X1(i: Double) { 
    print("Double") 
} 

func X1(i: Bool) { 
    print("Bool") 
} 

func X1(i: Float) { 
    print("Float") 
} 
+0

を私は "R"、 "R"、 "R"、 "INT" を得たテスト・スウィフトのすべてのバージョンに。 (Swift 3.0,3.0.1,3.1,3.1.1,4.0) – Palle

+0

申し訳ありませんが、出力を修正しました。 – Joe

答えて

0

あなたはX2にRをキャストしようとすることができます:

func X2<R>(i: R) { 
    if let x = i as? Int { 
     X1(i: x) 
    } else { 
     X1(i: i) 
    } 
} 

これは、X1ののIntバージョンへの呼び出しを強制します。コンパイラーがジェネリックを専門に扱うようになると、すべてのキャストが消え去るでしょう。

状況に応じて、この問題を解決するために関連するタイプ制約付きプロトコル拡張を使用できる場合があります。

+0

ありがとうございますが、これはX2の特殊化を追加するよりも優れているようです。 – Joe

0

私はそれがint型用のX2を専門とすることで動作します

func X1<R>(i: R) { 
    print("Any") 
} 
func X1(i: Int) { 
    print("Int") 
} 

func X2<R>(i: R) { 
    X1(i: i) 
} 
func X2(i: Int) { 
    X1(i: i) 
} 

X2(i: "s") 
X2(i: 1) 
X1(i: "s") 
X1(i: 1) 
+0

ありがとう、それは私がすでに言及したことです - 私はX2を専門にすることでこれを行うことができます。これはX1の専門分野がたくさんある場合にはあまり役に立ちません。 – Joe

関連する問題