この関数をジェネリック型に変換するにはどうすればよいですか?
func addThreeValue(value1:String,value2:String,value3:String) -> String {
let concatenated = value1 + value2 + value3
return concatenated
}
これは機能しません:
func addThreeValues<T>(v1: T, _ v2: T, _ v3: T) -> T {
return v1 + v2 + v3
}
コンパイラは+
、T
sで動作する演算子を認識していないためです。
適切な演算子を見つけることができるように、汎用パラメーターを制約する必要があります+
。IntegerTypeプロトコルは1を提供します。
func addThreeValues<T: IntegerType>(v1: T, _ v2: T, _ v3: T) -> T {
return v1 + v2 + v3
}
ただし、Stringは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"
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加