2016-04-13 5 views
0

この関数をジェネリック型にするにはどうすればよいですか?この関数をジェネリック型にするにはどうすればよいですか?

func addThreeValue(value1:String,value2:String,value3:String) -> String { 
    let concatenated = value1 + value2 + value3 

    return concatenated 
} 
+0

なぜお望みですか?あなたの目標は何ですか? – jtbandes

+0

私は同じことをする2つの異なる機能を持っているので。 1つは文字列を一緒に追加し、もう1つは整数です。私はそれをやる方法を学びたいと思う。ありがとう – SteveSmith

+0

StringとIntの両方の+機能をサポートする組込みプロトコルはありません。自分で定義する必要があります。 – jtbandes

答えて

1

この意志ない作品:

func addThreeValues<T>(v1: T, _ v2: T, _ v3: T) -> T { 
    return v1 + v2 + v3 
} 

コンパイラはT秒で動作する任意の+オペレータについて知らないので。

適切な+演算子が見つかるように、に汎用パラメータを指定する必要があります。IntegerType protocolは1を提供しています。

func addThreeValues<T: IntegerType>(v1: T, _ v2: T, _ v3: T) -> T { 
    return v1 + v2 + v3 
} 

ただし、文字列がIntegerTypeプロトコルに準拠していない:

addThreeValues("a", "b", "c") // error: cannot invoke 'addThreeValues' with an argument list of type '(String, String, String)' 

この問題を回避するために独自のプロトコルを定義し、あなたがしたい方のタイプの不適合を提供することができ使用:

protocol Addable { 
    func +(lhs: Self, rhs: Self) -> Self 
} 
extension String: Addable {} 
extension Int: Addable {} 

func addThreeValues<T: Addable>(v1: T, _ v2: T, _ v3: T) -> T { 
    return v1 + v2 + v3 
} 

今、この作品:

addThreeValues(1, 2, 3)  // returns 6 
addThreeValues("a", "b", "c") // returns "abc" 
+0

すばらしい説明をありがとう!私はこの答えを受け入れた。 – SteveSmith

関連する問題