gpt4 book ai didi

swift - 为什么 IndexSet 说插入了一个新元素,即使该元素已经在集合中?

转载 作者:行者123 更新时间:2023-12-04 03:31:28 26 4
gpt4 key购买 nike

使用 Set,我可以方便地将一个元素插入到集合中,还可以通过调用 insert 检查该元素是否在集合中:

let array = [1,2,3,4,4,2,5,3,6,7,1]
var set = Set<Int>()
for item in array {
// set.insert not only inserts the item, but also tells me whether the item was in set before the insert
if set.insert(item).inserted {
print("Encountered new item: \(item)")
} else {
print("\(item) has already been encountered!")
}
}

输出:

Encountered new item: 1
Encountered new item: 2
Encountered new item: 3
Encountered new item: 4
4 has already been encountered!
2 has already been encountered!
Encountered new item: 5
3 has already been encountered!
Encountered new item: 6
Encountered new item: 7
1 has already been encountered!

但是,如果我使用 IndexSet 重写相同的逻辑:

let array = [1,2,3,4,4,2,5,3,6,7,1]
var set = IndexSet()
for item in array {
// set.insert not only inserts the item, but also tells me whether the item was in set before the insert
if set.insert(item).inserted {
print("Encountered new item: \(item)")
} else {
print("\(item) has already been encountered!")
}
}

输出变为:

Encountered new item: 1
Encountered new item: 2
Encountered new item: 3
Encountered new item: 4
Encountered new item: 4
Encountered new item: 2
Encountered new item: 5
Encountered new item: 3
Encountered new item: 6
Encountered new item: 7
Encountered new item: 1

似乎 IndexSet.insert 返回的元组总是匹配 (true, _),但即便如此,集合的 count 是没有增加。我必须在 insert 之前检查 set.contains(item) 以生成所需的输出。

问题:这是 IndexSet 的预期行为吗?

我知道 IndexSet 是一个 Cocoa API,而不是 Swift 原生的,所以我想也许 IndexSet 有一些特殊的语义,说明它对两个人意味着什么数字与我不知道的“相同”。我也找了bug reports在 bugs.swift.org 上关于 IndexSet,但我没有找到任何关于 insert 总是返回 true 的信息。

最佳答案

IndexSetNSIndexSetNSMutableIndexSet 的 Swift 值叠加类型。从 IndexSet.swift 中的实现中可以看出, IndexSet 上的所有操作都转发到 NS(Mutable)IndexSet

// Temporary boxing function, until we can get a native Swift type for NSIndexSet
@inline(__always)
mutating func _applyMutation<ReturnType>(_ whatToDo : (NSMutableIndexSet) throws -> ReturnType) rethrows -> ReturnType {

// ...
}

显然不允许确定插入是否已经存在,这在源代码中被标记为“TODO”:

/// Insert an integer into the `IndexSet`.
@discardableResult
public mutating func insert(_ integer: Element) -> (inserted: Bool, memberAfterInsert: Element) {
_applyMutation { $0.add(integer) }
// TODO: figure out how to return the truth here
return (true, integer)
}

因此 IndexSet.insert(value) 调用 NSMutableIndexSet.add(value),如果新值不存在,它会将新值添加到索引集中。就索引唯一而言,它的行为是正确的,但 inserted 返回值始终是 true

关于swift - 为什么 IndexSet 说插入了一个新元素,即使该元素已经在集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66718320/

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