【问题标题】:Swift - Binary Operator == cannot be applied to two [[Double]] operands [duplicate]Swift - 二元运算符 == 不能应用于两个 [[Double]] 操作数 [重复]
【发布时间】:2017-03-13 11:02:26
【问题描述】:

我写了一个这样的小快速函数:

func compareTest(values: [[Double]]) {
    if(values == [[1.0,2.0]]) {
         // some code   
    }
}

但是当我尝试编译时,我得到一个比较错误:

二元运算符 == 不能应用于两个 [[Double]] 操作数。

我在这里的问题中进行了搜索。大多数答案是错误消息具有误导性,并且人们使用了错误的类型 (Example Question)。

有人可以帮助我吗?我写的类型不正确?

【问题讨论】:

标签: swift


【解决方案1】:

在这种情况下没有任何误导。

通常== 运算符是为Equatable 项目定义的。这允许将两个 Double 值相互比较,例如1.0 == 1.0.

然后我们在 Equatable 项目的数组上定义了一个特定的 == 运算符:

public func ==<Element : Equatable>(lhs: [Element], rhs: [Element]) -> Bool

这意味着您可以将任何数组与相等的项目进行比较。但是,数组本身不是Equatable。

没有为嵌套数组定义这样的运算符。

你必须定义:

public func ==<Element : Equatable>(lhs: [[Element]], rhs: [[Element]]) -> Bool {
   ...
}

【讨论】:

  • 啊,我认为当元素相等时数组是相等的?有条件协议?这不会使嵌套数组也可以相等吗?还是说 Array 根本不符合 Equatable 协议?
  • @Forgmeister 只有运算符,它们不是 Equatable。如果项目符合该协议,我不确定是否可以使泛型符合该协议。
  • @Fogmeister 目前语言中没有条件一致性 (although there soon will be :))
【解决方案2】:

我不熟悉 Swift,但作为任何语言的一般规则,不应该使用相等运算符比较双精度值。相反,如果两个 double 值的绝对算术差小于 epsilon,则应将其视为相等

var epsilon = 0.00000001;
if(fabs(v1-v2)< epsilon){ // values are considered equal
}

【讨论】:

  • 不是问题,因为他遇到了编译器错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多