你能写一个通用函数来比较任何数字类型(例如 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
}
我们正在尝试编写一个简单的 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
}