可比较的Swift数字类型

时间:2016-11-21 09:43:57

标签: swift generics numeric

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 协议来实现它们。是否有我不知道的内置协议?

我很欣赏保守的方法(强迫程序员注意他们正在比较不同的数字类型)。我只是想知道它是否值得。

最后,我们当然可以使用扩展来添加此功能。也许泛型?如果您有首选或默认的处理方式,请分享。

0 个答案:

没有答案