swift - 如何将此函数转换为泛型类型?

标签 swift generics

我该如何将此函数转换为泛型类型?

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 一起使用的 + 运算符。

您需要约束通用参数,以便它可以找到合适的+运算符。 IntegerType protocol提供一个:

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

但是,String 不符合 IntegerType 协议(protocol):

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

要解决此问题,您可以定义自己的协议(protocol)并为您要使用的任何类型提供一致性:

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"

关于swift - 如何将此函数转换为泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36611334/

相关文章:

java - 实例化泛型类型 ArrayList<T>

generics - 实现拥有和借用的特征

c# - 哪种方法是了解传递给 C# 中泛型方法的参数类型的正确方法?

c# - 在 C# 中,您可以将一个泛型类型转换为另一个泛型类型吗?谁的 T 参数是第一个 T 的子类?

swift - 如何从 UICollectionCell 中访问 UIViewController 函数?

Java 1.4 到 Java 1.5 - 重写代码并避免 @SuppressWarnings

swift - 在 WatchOS 4 上录制音频

properties - 多个实例中的 Swift 唯一属性

swift - 有没有办法覆盖 Swift 数组的写入时复制行为?

ios - 自定义委托(delegate)类