基于运算符的Swift通用约束

时间:2016-05-03 11:42:48

标签: swift generics operator-overloading

假设我想要添加数组条目的所有值。不仅是整数,还有双值或我自己创建的一些实现+运算符的类型。所以我的问题是:如果类型实现运算符,是否可以使用基于事实的约束来创建这样的函数?比如或类似的东西(显然这不起作用)。

提前致谢

1 个答案:

答案 0 :(得分:1)

有几种方法可以解决问题。

IntegerArithmeticType

虽然我知道没有明确的方式说“嘿Swift,我想只允许T有这个操作符的类型T”,我们通常认为所有类型都能够被添加,减去,相乘和分割自动符合到IntegerArithmeticType,它可以用作任何通用函数或类型的通用约束。

例如:

func addAll<T: IntegerArithmeticType>(array: [T]) -> T {
    var count = array[0]
    for (index, value) in array.enumerate() {
        if index != 0 {
            count += value
        }
    }
    return count
}

注意在这个快速模型版本中,我使用数组的第一个值初始化count,然后通过在for循环内检查索引0来避免重复计算。我无法将count初始化为0,因为0是Int,而我希望count属于T类型。

你提到你自己的类型也适用于此。一种选择是让您的自定义类型符合IntegerArithmeticType,但它需要的不仅仅是+运算符。有关IntegerArithmeticType的详细信息,请参阅SwiftDoc

自定义协议

如果符合IntegerArithmeticType对您施加某种限制,您可以使用+功能以及您想要的任何其他要求创建自定义协议。毕竟,操作员实际上只是功能。请注意,您可以使用扩展名添加已存在类型的一致性。例如:

protocol Addable {
    func +(left: Self, right: Self) -> Self
    // Other requirements...
}

extension Int: Addable {}
extension Double: Addable {}