gpt4 book ai didi

比较两个可选数组的 Swift 错误

转载 作者:搜寻专家 更新时间:2023-10-31 08:18:59 24 4
gpt4 key购买 nike

我在下一段 Swift 代码中遇到编译错误

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

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

Binary operator '==' cannot be applied to two Array<Int?> operands

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

为什么会这样?

最佳答案

这里的问题是具有 == 运算符的东西与“可相等的”东西之间的区别。

OptionalArray 都有一个 == 运算符,当它们包含的内容是可等式的时,它会起作用:

// 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 要求它的内容是可散列的(因此是可等化的),它可以是可等化的:

let setarray: [Set<Int>] = [[1,2,3],[4,5,6]]
setarray == [[1,2,3],[4,5,6]] // true

关于比较两个可选数组的 Swift 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28830411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com