你能编写一个泛型函数来比较任何数字类型(例如int,float,double)与零吗?

时间:2018-04-27 15:58:35

标签: generics swift4 comparable

我们正在尝试编写一个简单的增益/损失函数,以根据相对于零的值返回颜色。如果是积极的,我们会返回绿色。如果是负数,我们会返回红色。如果为零,我们返回灰色。

当前函数专门用于获取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#)中,您可以获取类型的默认值,在数值的情况下,它是零。斯威夫特有类似的东西吗?如果是这样,我们可以这样做......

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
    }
}

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

1 个答案:

答案 0 :(得分:2)

我的解决方案增加了第二个协议一致性:COLUMN(1:2)为标量类型提供了基本的算术运算符。

然后您可以计算泛型类型

中的零值
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

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

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
    }
}