【问题标题】:Is there a Swift one-liner to remove an element from an array if present and append it if not?是否有一个 Swift 单行器可以从数组中删除一个元素(如果存在),如果不存在则附加它?
【发布时间】:2020-01-12 03:31:28
【问题描述】:

这是我经常遇到的一个结构。有没有一种在 Swift 中单行的好方法?

我可以为它写一个关于 Sequence 的扩展,但我觉得有一种“明显的”高阶函数/集合论技术在躲避我。

if array.contains(element) {
    array.removeObject(object: element)
}
else {
    array.append(element)
}

我认为解决方案本身不一定会更好,这只是我每次写这篇文章时的想法。

【问题讨论】:

  • 是否可以选择使用Set 代替?
  • 简单的答案是不使用 Array ,尝试使用 Set 。 Set 不接受重复,因此如果已存在则不会添加。
  • 一行一样:array.contains(element) ? array.removeObject(object: element) : array.append(element)
  • @Starsky,我的同事建议这样做。她给它加上了//Technically one line ????
  • 与其写最短的代码,不如写最高效的代码????而且 Swift 中没有与 NSArray 的 removeObject 等价的东西。

标签: swift higher-order-functions set-theory


【解决方案1】:

我发现了集合论中让我望而却步的部分!我想要的结果是两个数组的Symmetric Difference,而这个包含在Swift's set中的:

var element = Set([1])
var set = Set([1, 2, 3])

set = set.symmetricDifference(element) //2, 3
set = set.symmetricDifference(element) //1, 2, 3

【讨论】:

  • 你不需要将元素转换为集合,你可以写set = set.symmetricDifference([1])
【解决方案2】:

您可以尝试改用Set

var set: Set<Int> = [1, 2, 4]
if !set.insert(4).inserted {
    set.remove(4)
}

【讨论】:

    猜你喜欢
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多