Как отфильтровать массив объектов по условию во вложенном массиве (отношение ко многим) в iOS Swift - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь отфильтровать массив объектов в соответствии с условием во вложенном отношении ко многим и не знаю, как написать фильтр.

Чтобы проиллюстрировать это, представьте, что я смоделировал систему, которая управляет людьми, поступающими в колледж, и смоделировал следующие сущности и отношения:

  • Лицо, имеющее отношение ко многим со Школьной сущностью
  • Школьная сущность, которая имеет отношение «один к одному» с сущностью SchoolType (в дополнение к отношениям «обратный ко многим» с сущностью Person)
  • Сущность SchoolType, которая имеет отношение один к одному с Сущность FinancialAwardType (в дополнение к отношениям типа «обратный ко многим» с сущностью School)

  • объект FinancialAwardType

Объект FinancialAwardType просто получает различные типы финансовых вознаграждений, например, например, грант, стипендию или кредит.

Для целей этого примера требование состоит в том, чтобы финансовые вознаграждения были специфичны для типов школ, следовательно, моделирование отношений между сущностями SchoolType и FinancialAwardType как таковыми.

То, что я хочу сделать, - это создать фильтр, который даст мне подмножество лиц, которые подали заявки в школы, предлагающие определенный тип финансового вознаграждения, и мне трудно определить, как написать такой фильтр, учитывая вложенные отношения «ко многим».

Я потенциально могу сделать это в несколько шагов, например:

  1. фильтрация списка SchoolTypes, чтобы получить только SchoolTypes, которые предлагают награды за заслуги ....
  2. затем отфильтруйте Школы, чтобы дать мне только те Школы, которые относятся к одному из отфильтрованных Типов школ ....
  3. тогда, отфильтруйте людей, чтобы дать мне только тех людей, которые обратились к эти отфильтрованные школы ...

Это кажется несколько неэффективным, и мне интересно, есть ли более элегантное решение для выполнения фильтра, который я ищу. Любые предложения будут ценны. При необходимости я могу показать код или фрагменты кода, которые я пытался выполнить для вышеуказанных шагов.

В ответ на некоторые комментарии и предложения ... я надеялся использовать filter () для возврата коллекции Persons ... что-то вроде этого:

    let personsReceivingGrants = persons.schoolsApplied.filter() {

        $0.schoolType?.awardType?.name == "Grant Award"
    }

Проблема в том, что отношение Person-> School ко многим определяется как NSSet of Any, а Any не имеет типа schoolType ... Можно ли быть более точным с точки зрения указания компилятору, какой тип объекта находится в NSSet, чтобы я мог использовать механизм filter ()? Или есть другой более подходящий подход для достижения этой фильтрации?

Заранее спасибо за любые предложения или помощь.

1 Ответ

0 голосов
/ 29 апреля 2018

Так что, как только я отредактировал свой вопрос в ответ на предложенные здесь предложения и обсудил его более подробно, я понял, что проблема заключается просто в том, чтобы конкретизировать тип в NSSet. Поэтому я изменил код на следующий, и теперь это работает. Я хотел бы опубликовать это решение здесь на случай, если другие столкнутся с той же проблемой:

    let personsReceivingGrants = (persons.schoolsApplied as Set<School>).filter() {

        $0.schoolType?.awardType?.name == "Grant Award"
    }
...