如何将此函数转换为通用类型?

史蒂夫·史密斯

我将如何将该函数转换为通用类型?

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
}

因为编译器不知道任何+Ts配合使用运算符

您需要限制通用参数,以便它可以找到合适的+运算符。所述IntegerType协议提供一个:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章