这是我经常遇到的结构。有没有一种在 Swift 中单行的好方法?
我可以为它写一个关于序列的扩展,但我觉得有一种"明显的"高阶函数/集合论技术让我无法理解。
if array.contains(element) {
array.removeObject(object: element)
}
else {
array.append(element)
}
我不认为解决方案本身会更好,这只是我每次必须写这篇文章时都会想到的事情。
我找到了集合论中躲避我的部分!我想要的结果是两个数组的对称差分,这包含在Swift 的集合中:
var element = Set([1])
var set = Set([1, 2, 3])
set = set.symmetricDifference(element) //2, 3
set = set.symmetricDifference(element) //1, 2, 3
您可以尝试改用Set
,
var set: Set<Int> = [1, 2, 4]
if !set.insert(4).inserted {
set.remove(4)
}
基于伟大的答案。詹姆斯·韦伯斯特。我们可以增强可重用性。
extension Set {
/// Inserts given element if it doesn't exist in the set or removes it.
///
mutating func withSymmetricDifference(_ element: Element) {
self = symmetricDifference([element])
}
}
用法
var set = Set([1, 2, 3])
set.withSymmetricDifference(1) // [1, 2, 3]
set.withSymmetricDifference(1) // [2, 3]