Как фильтровать из массива в ios swift

#arrays #swift #filter #unique

#массивы #быстрый #Фильтр #уникальный #swift

Вопрос:

У меня есть массив, в который я добавляю значения, поступающие из JSON.

вот так

 var tagsarray = [Tagging]()

tagsarray.append(Tagging.init(tags: tempTag[0], selected: false))
tagsarray.append(Tagging.init(tags: tempTag[1], selected: false))
  

Модель

 struct Tagging {
private(set) public var tags : String
 public var selected : Bool

init(tags : String, selected : Bool) {
    self.tags = tags
    self.selected = selected
  }
}
  

Теперь моя проблема состоит в том, чтобы отфильтровать массив одинаковых значений.

Комментарии:

1. Пожалуйста, опубликуйте больше кода

2. Добавьте модель тегирования в post.

3. Не имеет отношения, но private(set) в данном случае это бессмыслица в Swift. Если вам нужна константа, объявите константу: let tags : String

4. начинать название структуры с заглавной буквы

5. @ManWithBear Это допустимо, но на практике и в данном случае это константа. И есть (лучший) синтаксис для констант.

Ответ №1:

   let filteredArray = tagsarray.filter {$0.tags == "1"}
  print(filteredArray)
  

попробуйте эту простую функцию фильтрации

Ответ №2:

Если вас не волнует порядок, вы можете просто поместить все элементы в Set и преобразовать обратно в array.
Для этого ваш тип должен соответствовать Hashable .
Если все свойства вашего типа являются, Hashable тогда вы можете просто добавить : Hashable , и компилятор обработает rest за вас.

 struct tagging: Hashable {
    private(set) public var tags : String
    public var selected : Bool

    init(tags : String, selected : Bool) {
        self.tags = tags
        self.selected = selected
    }
}
tagsarray = Array(Set(tagsarray))
  

Но если вам нужно сохранить порядок элементов, вам нужно фильтровать вручную. Для этого вам понадобится Equatable . Это работает так же, как Hashable компилятор обработает реализацию за вас.

 struct tagging: Equatable {
    private(set) public var tags : String
    public var selected : Bool

    init(tags : String, selected : Bool) {
        self.tags = tags
        self.selected = selected
    }
}

tagsarray = tagsarray.reduce(into: []) { uniqs, tag in
    guard !uniqs.contains(tag) else { return }
    uniqs.append(tag)
}