我们正在尝试编写一个简单的增益/损失函数,以根据相对于零的值返回颜色。如果是积极的,我们会返回绿色。如果是负数,我们会返回红色。如果为零,我们返回灰色。
当前函数专门用于获取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
}
}
......或者首先这种做法是错误的吗?
答案 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
}
}