比较两个可选数组时出现 Swift 错误

2023-12-11

I get a 编译错误在下一个 Swift 代码中

var x:Array<Int?> = [1,2]
var y:Array<Int?> = [1,2]
if x == y {  // Error
}

如果两个数组都是Array<Int>它工作正常,但如果至少其中一个是可选的,它会抛出如下错误:

二元运算符“==”不能应用于两个Array<Int?>操作数

我几个月前提交了一份错误报告,但没有得到答复。它在 Swift 1.2 中仍然出现。

为什么会发生这种情况?


这里的问题是具有以下特征的事物之间的区别:==运算符,而不是“可等同的”东西。

Both Optional and Array有一个==运算符,当它们包含的内容相等时才起作用:

// if T is equatable, you can compare each entry for equality
func ==<T : Equatable>(lhs: [T], rhs: [T]) -> Bool
// if T is equatable, you can compare the contents, if any, for equality
func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool

let i: Int? = 1
let j: Int = 1
i == j          // fine, Int is Equatable
["a","b"] == ["a","b"]  // and so is String

但他们本身并不符合Equatable。鉴于您可以在其中放入不相等的类型,这是有道理的。但这样做的结果是,如果一个数组包含一个不可等式的类型,那么==行不通。由于选项不是Equatable,当您将可选值放入数组中时就会出现这种情况。

如果你尝试比较数组的数组,你会得到同样的结果:

let a = [[1,2]]
let b = [[1,2]]
a == b  // error: `==` can’t be applied to `[Array<Int>]`

如果你想特殊情况,你可以写==对于可选数组,如下所示:

func ==<T: Equatable>(lhs: [T?], rhs: [T?]) -> Bool {
    if lhs.count != rhs.count { return false }
    for (l,r) in zip(lhs,rhs) {
        if l != r { return false }
    }
    return true
}

举个反例,因为Set要求其内容可散列(因此可等同),它can可等同:

let setarray: [Set<Int>] = [[1,2,3],[4,5,6]]
setarray == [[1,2,3],[4,5,6]]  // true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

比较两个可选数组时出现 Swift 错误 的相关文章

随机推荐