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,因此在这里我无法辨别出差异。
这个玩了一会儿找到下面原来的答复一个实际的例子后,我发现了一个更简单的区别:由于elementsEqual你可以比较不同的类型,如集合Array,RandomAccessSlice并且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更可靠。
| 归档时间: |
|
| 查看次数: |
1964 次 |
| 最近记录: |