代码之家  ›  专栏  ›  技术社区  ›  Cesare

避免在swift数组中重复

  •  -2
  • Cesare  · 技术社区  · 6 年前

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

    class TranslationItems {
        var delegate: TranslationItemsDelegate?
    
        static let shared = TranslationItems()
    
        var array = [Translation]() {
            didSet {
                delegate?.newItemAdded()
            }
        }
    }
    

    问题是这允许重复(数组可能包含多个具有相同哈希值的项)。如果我检查里面的重复 didSet 然后在那里更改数组(例如通过执行 array = Array(Set(array)) )这会导致一个无限循环。

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

    3 回复  |  直到 6 年前
        1
  •  3
  •   vadian    6 年前

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

    var set = Set<Translation>()
    

    但是,如果要保留数组,则更有效的方法是添加 add 筛选重复项的方法, 翻译 必须符合 Equatable

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

    制作一个 Set Array 然后把它转换回 数组 不必要的昂贵。

        2
  •  2
  •   Robert Dresler Gustavo Vollbrecht    6 年前

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

    didSet {
        array = Array(Set(array))
        ...
    }
    
        3
  •  1
  •   Shehata Gamal    6 年前

    只需添加一个实例方法

    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))
      }
    }