Как мне отфильтровать массив объектов в Swift? - PullRequest
0 голосов
/ 24 сентября 2018

Привет! У меня есть массив объектов типа Book, и я пытаюсь вернуть все книги, отфильтрованные по атрибуту tags.Например,

var books = [

(title = "The Da Vinci Code", tags = "Religion, Mystery, Europe"), 
(title = "The Girl With the Dragon Tatoo", tags = "Psychology, Mystery, Thriller"), 
(title = "Freakonomics", tags = "Economics, non-fiction, Psychology")

}]

и я хочу найти книги, связанные с тегами Psychology, (title = "The Girl With the Dragon Tatoo", tag = "Psychology, Mystery, Thriller") и (title = "Freakonomics", tags = "Economics, non-fiction, Psychology"), как мне это сделать?

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Представление книг в виде массива кортежей с именованными параметрами title и тегами для названия книги и тегов соответственно.

let books:[(title:String, tags:String)] = [

    (title: "The Da Vinci Code", tags: "Religion, Mystery, Europe"),
    (title: "The Girl With the Dragon Tatoo", tags: "Psychology, Mystery, Thriller"),
    (title: "Freakonomics", tags: "Economics, non-fiction, Psychology")

]

Вы хотите найти тег Psychology

let searchedTag = "Psychology"

Мы можем использовать функцию filter, чтобы отфильтровать элементы в массиве книг, который содержит только искомый тег.

let searchedBooks = books.filter{ $0.tags.split(separator: ",").map{ return $0.trimmingCharacters(in: .whitespaces) }.contains( searchedTag ) }

print(searchedBooks)

Внутри метода фильтра мы создали массив элементов тега изтеги книги с использованием метода split(separator: Character).Затем, используя функцию map, мы удаляем начальные и конечные пробелы из каждого тега.Наконец, используя метод .contains(element), мы проверяем, находится ли искомый тег в этом массиве.Возвращаются только кортежи, прошедшие этот тест, а остальные будут отфильтрованы.

Результат:

[(title: "Девушка с татуировкой дракона", теги:«Психология, Мистерия, Триллер»), (название: «Фрикономика», теги: «Экономика, фантастика, Психология»)]

0 голосов
/ 24 сентября 2018

Так что я быстро сделал это, чтобы выручить, если кто-то может улучшить это хорошо, я просто пытаюсь помочь.

Я создал структуру для книг

struct Book {
    let title: String
    let tag: [String]
}

Создалмассив из них

var books: [Book] = []

Что пусто.

Я создал новый объект для каждой книги и добавил в книги

let dv = Book(title: "The Da Vinci Code", tag: ["Religion","Mystery", "Europe"])
books.append(dv)
let gdt = Book(title: "The Girl With the Dragon Tatoo", tag: ["Psychology","Mystery", "Thriller"])
books.append(gdt)
let fn = Book(title: "Freakonomics", tag: ["Economics","non-fiction", "Psychology"])
books.append(fn)

Итак, у вас есть три объекта вкнижный массив сейчас.Попробуйте проверить с помощью

print (books.count)

Теперь вы хотите отфильтровать книги по психологии.Я отфильтровал массив по тегам психологии - подходят ли вам фильтры?

let filtered = books.filter{ $0.tag.contains("Psychology") } 
filtered.forEach { print($0) }

Какая печать объектов с вашими двумя книгами по психологии

Книга (название: "Девушка статуировка дракона ", тег: [" Психология "," Тайна "," Триллер "])

Книга (название:" Фрикономика ", тег: [" Экономика "," Нехудожественная литература "," Психология ""])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...