你能写一个通用函数来比较任何数字类型(例如 int、float、double)和零吗?

Can you write a generic function that will compare any numeric type (e.g. int, float, double) against zero?

我们正在尝试编写一个简单的 gain/loss 函数来 return 基于相对于零的值的颜色。如果是肯定的,我们 return 绿色。如果为负,我们 return 红色。如果为零,我们 return 灰色。

当前的函数是专门为了取一个double而写的,像这样:

func getChangeColor(value:Double) -> UIColor {

    if value > 0 {
        return Theme.Colors.gain
    } else if value < 0 {
        return Theme.Colors.loss
    } else {
        return Theme.Colors.noChange
    }
}

但我想知道是否可以将其更新为采用 任何 数值?

我的第一个想法是针对 Comparable 编写它,但问题是我们需要将它与相同类型的零进行比较,无论它是什么。

在 C# 等其他语言中,您可以获得类型的默认值,对于数字,默认值为零。 Swift有没有类似的东西?如果是这样,我们可以这样做...

func getChangeColor<T:Comparable>(value:T) -> UIColor {

    let defaultValue = default(T.self)

    if value > defaultValue {
        return Theme.Colors.gain
    } else if value < defaultValue {
        return Theme.Colors.loss
    } else {
        return Theme.Colors.noChange
    }
}

...或者这种方法首先是错误的?

我的解决方案添加了第二个协议一致性:Numeric 为标量类型提供基本算术运算符。

然后你就可以计算泛型中的零值

func getChangeColor<T : Comparable & Numeric>(value:T) -> UIColor {

    let zero = value - value

    if value > zero {
        return Theme.Colors.gain
    } else if value < zero {
        return Theme.Colors.loss
    } else {
        return Theme.Colors.noChange
    }
}

或使用 switch 语句

func getChangeColor<T : Comparable & Numeric>(value:T) -> UIColor {

    let zero = value - value

    switch value {
    case zero:  return Theme.Colors.noChange
    case zero...: return Theme.Colors.gain
    default: return Theme.Colors.loss
    }
}

或使用三元运算符(由 OP 添加)

func getChangeColor<T : Comparable & Numeric>(value:T) -> UIColor {

    let zero = value - value

    return value > zero
        ? Theme.Colors.gain
        : value < zero
            ? Theme.Colors.loss
            : Theme.Colors.noChange
}