我如何将此功能转换为通用类型?
func addThreeValue(value1:String,value2:String,value3:String) -> String {
let concatenated = value1 + value2 + value3
return concatenated
}
答案 0 :(得分:1)
这将不工作:
func addThreeValues<T>(v1: T, _ v2: T, _ v3: T) -> T {
return v1 + v2 + v3
}
因为编译器不知道任何与+
一起使用的T
运算符。
您需要约束通用参数,以便它可以找到合适的+
运算符。 IntegerType protocol提供了一个:
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"