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