- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 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 的信息。
最佳答案
IndexSet
是 NSIndexSet
和 NSMutableIndexSet
的 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/
我想通过使用 .onDelete 修饰符在 SwiftUI Section 上实现滑动删除功能。问题是它总是删除列表中的第一项。 我的 View 有一个列表,其中包含使用 ForEach 创建的动态部
documentation关于IndexSet说: The range of valid integer values is 0..
我正在使用 IndexSet 并尝试访问一些有时是连续的而有时不是连续的索引。 例如,我的集合可能包含[1, 2, 3, 5, 6, 7, 13, 31] 我想从 3...13 的范围中提取出集合,但
使用 Set,我可以方便地将一个元素插入到集合中,还可以通过调用 insert 检查该元素是否在集合中: let array = [1,2,3,4,4,2,5,3,6,7,1] var set = S
我有我的联系对象: struct Contact: Codable, Identifiable { var id: Int = 0 var name: String var l
for number in 0..
我有一个非常简单的 ForEach 列表,使用 onDelete() 删除条目没有问题。然而,由于元素中的一个变量存储了一个文件的 url,我不想留下这个,我希望通过 FileManager 实现清理
我想将 NStableView.selectedRowIndexes 转换为一个 int 数组。有没有快速的方法来做到这一点?或者我应该迭代 IndexSet 并将每个项目推送到数组吗? 最佳答案 有
在 Objective-C Cocoa 中,我们有 NSIndexSet 类,它通过保留范围数组来有效地存储一系列唯一索引。例如。集合 1、2、... 30、57 将存储为范围 1-30 和 57,而
接收 “IndexSet”类型的值在 enumerateIndexesUsingBlock 处没有成员“enumerateIndexesUsingBlock” 错误。 /** Extension fo
我是一名优秀的程序员,十分优秀!