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

3

我写了一个小的Swift函数,就像这样:

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

但是当我尝试编译时,在比较处出现错误:

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

我在这里搜索了相关问题。大多数答案都是错误信息具有误导性,人们使用了错误的类型(示例问题)。

有人能帮我吗?我是否写错了类型?


数组实现了Equatable吗? - Carcigenicate
https://dev59.com/3V4c5IYBdhLWcg3wv8hl - Vyacheslav
2个回答

3
在这种情况下没有误导。
通常,== 操作符是为可比较的项目定义的。这允许两个 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 {
   ...
}

1
啊,我以为当元素可比较时,数组也是可比较的?使用条件协议?那么嵌套的数组不也应该是可比较的吗?还是说数组根本不符合可比较协议? - Fogmeister
@Forgmeister 只有运算符,它们不可比较。我不确定是否可能使通用类型符合该协议,如果该项符合该协议。 - Sulthan
2
@Fogmeister 目前语言中没有条件一致性(虽然很快就会有了 :)) - Hamish

-2

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

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

不是因为他遇到编译器错误才出现这个问题。 - Carcigenicate

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接