Swift原生数字类型( Int , Double , Float )符合Comparable协议,因此可以与"进行比较。 >"和"<"和类似的运营商。
但是,在比较数值变量时; Int 无法与 Double 进行比较,也不能将 Float 与 Int 等进行比较,因为没有用于比较这些类型的实现在它们各自的实现中,它们仅引用用于比较 Self 的实现。例如:
public static func >(lhs: Self, rhs: Self) -> Bool
所以我的问题是,为什么这样做的事情呢?为什么我们没有在Int中使用默认实现来与Double或Float进行比较,反之亦然?毕竟,它们在数学方面都具有可比性。当然这会产生可读的语法(在Swift 3.0中有很多变化的议程)。
因此我们可以:
let foo = Double(3.14)
let bar = Int(2)
if foo > bar {
// can be compared because foo of type Double is greater than bar of type integer
}
而不是:
let foo = Double(3.14)
let bar = Int(2)
if foo > Double(bar) {
// now we had to "cast" bar to a Double because if we make foo an Int we'd loose some accuracy (but that's not the point here)
}
是不是因为我们希望将关注点分开,而不是 Int "知道"关于 Double 或 Float ?是因为我们还不想要一个更具体的 NumericComparable 协议来实现它们。是否有我不知道的内置协议?
我很欣赏保守的方法(强迫程序员注意他们正在比较不同的数字类型)。我只是想知道它是否值得。
最后,我们当然可以使用扩展来添加此功能。也许泛型?如果您有首选或默认的处理方式,请分享。