在Swift中elementsEqual和'=='有什么区别?

arc*_*all 4 arrays sequence swift

我正在浏览Swift标准库,并且遇到了用于比较序列的elementsEqual方法。

我没有真正看到此函数的值,因为只有在顺序完全相同时它才会返回true。我认为如果可以告诉我两个序列是否包含相同的元素,它们恰好处于不同的顺序,那将有一定用处,因为这可以避免我自己对两个元素进行排序的麻烦。

这使我想到了一个问题:

比较两个序列时,使用elementsEqual和'=='有什么区别吗?一个人与另一个人有优点和缺点吗?

我在操场上,并做了以下测试:

let values = [1,2,3,4,5,6,7,8,9,10] let otherValues = [1,2,3,4,5,6,7,8,9,10] values == otherValues values.elementsEqual(otherValues)

这两项检查均得出true,因此在这里我无法辨别出差异。

Ben*_*ess 5

这个玩了一会儿找到下面原来的答复一个实际的例子后,我发现了一个更简单的区别:由于elementsEqual你可以比较不同的类型,如集合ArrayRandomAccessSlice并且Set,在与==你不能这样做:

let array = [1, 2, 3]
let slice = 1...3
let set: Set<Int> = [1, 2, 3] // remember that Sets are not ordered

array.elementsEqual(slice) // true
array.elementsEqual(set) // false
array == slice // ERROR
array == set // ERROR
Run Code Online (Sandbox Code Playgroud)

至于到底有什么不同,@ Hamish在下面的评论中提供了指向该实现的链接,我将分享这些链接以获得更好的可见性:

我的原始答案:

这是为您提供的示例游乐场,它说明了两者之间的区别:

import Foundation

struct TestObject: Equatable {
    let id: Int
    static func ==(lhs: TestObject, rhs: TestObject) -> Bool {
        return false
    }
}

// TestObjects are never equal - even with the same ID
let test1 = TestObject(id: 1)
let test2 = TestObject(id: 1)
test1 == test2 // returns false

var testArray = [test1, test2]
var copiedTestArray = testArray

testArray == copiedTestArray // returns true
testArray.elementsEqual(copiedTestArray) // returns false
Run Code Online (Sandbox Code Playgroud)

也许有人肯定知道,但是我的猜测是==计算类似的内容memoryLocationIsEqual || elementsEqual(在内存位置确实相等后会停止评估)并elementsEqual跳过内存位置部分,这使==速度更快,但elementsEqual更可靠。