【问题标题】:Swift generic constraints based on operator基于运算符的 Swift 通用约束
【发布时间】:2016-05-03 11:42:47
【问题描述】:

假设我想将一个数组条目的所有值相加。不仅是整数,还有双精度值或我自己创建的实现 + 运算符的某种类型。所以我的问题是:如果类型实现了运算符,是否可以创建具有基于事实的约束的函数?例如或类似的东西(显然这不起作用)。

提前致谢

【问题讨论】:

  • 您介意举一个这样的数组示例吗?如果它们都实现了 + 运算符,那么您可以将值映射为 double,然后对该数组求和。

标签: swift generics operator-overloading


【解决方案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 来避免重复计数。我无法用 0 初始化 count,因为 0 是 Int,而我希望 count 的类型为 T

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

自定义协议

如果符合IntegerArithmeticType 对您施加了某种限制,您可以使用+ 函数和您想要的任何其他要求创建自定义协议。毕竟,运算符实际上只是函数。请注意,您可以通过扩展添加对现有类型的一致性。例如:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多