Избегайте дубликатов в массиве Swift - PullRequest
0 голосов
/ 25 декабря 2018

Я создал этот синглтон для доступа к общему массиву в моем приложении:

class TranslationItems {
    var delegate: TranslationItemsDelegate?

    static let shared = TranslationItems()

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

Проблема в том, что это допускает дублирование (массив может содержать несколько элементов с одинаковым hashValue).Если я проверю наличие дубликатов в установщике didSet, а затем изменю там массив (например, выполнив array = Array(Set(array))), что приведет к бесконечному циклу.

Как удалить дубликаты в моем классе?

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Просто добавьте один метод экземпляра

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))
  }
}
0 голосов
/ 25 декабря 2018

Если вы хотите избежать дубликатов, почему бы вам не использовать 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 неоправданно дорого.

0 голосов
/ 25 декабря 2018

Вы можете сделать это именно так, как вы предложили.Это не приводит к бесконечному циклу

didSet {
    array = Array(Set(array))
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...