避免在Swift数组中重复

时间:2018-12-25 11:22:27

标签: swift

我创建了这个单例以访问整个应用程序中的共享阵列:

class TranslationItems {
    var delegate: TranslationItemsDelegate?

    static let shared = TranslationItems()

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

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

如何删除课程中的重复项?

3 个答案:

答案 0 :(得分:3)

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

var set = Set<Translation>()

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

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

Set中创建一个Array,然后将其转换回Array是不必要的。

答案 1 :(得分:2)

您可以按照建议进行操作。这不会导致无限循环

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

答案 2 :(得分:1)

只需添加一个实例方法

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