【问题标题】:Avoid duplicates in Swift array避免 Swift 数组中的重复
【发布时间】:2019-05-24 02:48:03
【问题描述】:

我创建了这个单例来访问整个应用程序中的共享数组:

class TranslationItems {
    var delegate: TranslationItemsDelegate?

    static let shared = TranslationItems()

    var array = [Translation]() {
        didSet {
            delegate?.newItemAdded()
        }
    }
}

问题在于这允许重复(数组可能包含具有相同 hashValue 的多个项目)。如果我检查 didSet 设置器中的重复项,然后更改那里的数组(例如通过执行 array = Array(Set(array))),这会导致无限循环。

我如何删除班级中的重复项?

【问题讨论】:

标签: swift


【解决方案1】:

如果你想避免重复,为什么不使用 Set (Translation 必须符合 Hashable)?

var set = Set<Translation>()

但是,如果您想保持数组更有效的方法是添加一个过滤重复项的add 方法,Translation 必须符合Equatable

func add(object: Translation) {
    if !array.contains(object) {
       array.append(object)
       delegate?.newItemAdded()
    }
}

Array 生成Set,然后将其转换回Array 成本太高了。

【讨论】:

  • 对于大量元素,array.contains 将变为 expensive
  • @Carpsen90 不如Array(Set(array)) 贵?
  • 是的,这就像用错误的手伸向你的耳朵?不知道为什么这样的答案会被赞成......
  • @Carpsen90 大多数人,尤其是新手,都在寻找最简单/最短的解决方案,但不一定是最有效的。
  • [OT] @Cesare Marry is sposare ? Buon Natale.
【解决方案2】:

只需添加一个实例方法

class TranslationItems {

  var delegate: TranslationItemsDelegate?

  static let shared = TranslationItems()

  private(set) var array = [Translation]() {
      didSet {
          delegate?.newItemAdded()
      }
  } 

  func set(array:[Translation]) {
      self.array = Array(Set(array))
  }
}

【讨论】:

    【解决方案3】:

    你完全可以按照你的建议去做。这不会导致无限循环

    didSet {
        array = Array(Set(array))
        ...
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2012-06-10
    • 1970-01-01
    • 2017-09-20
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多