Моя модель:
Я хочу получить массив стран ТОЛЬКО с городами, названия которых содержат заданную часть слова.
Я пытался:
let request : NSFetchRequest<Country> = Country.fetchRequest()
request.predicate = NSPredicate(format: "SUBQUERY(cities, $city, $city.name CONTAINS[cd] %@).@count > 0", givenWordPart)
let countries: [Country] = try! context.fetch(request)
Но он возвращает массив стран со ВСЕМИ городами в нем.





Это ожидаемое поведение. Он запрашивает Countries и возвращает те, которые соответствуют предикату. У возвращенных Countries все еще есть все их города, и если вам нужны только города с определенным правилом, вам понадобится коллекция cities для каждого Country.
Я думаю, вам нужно вместо этого собрать свой результат в две отдельные коллекции. Вместо этого создайте запрос на выборку для города, используя тот же предикат, что и выше, но как обычный запрос вместо подзапроса.
Это вернет массив экземпляров City, которые соответствуют вашим критериям поиска, чтобы получить выбор стран, которые вы могли бы извлечь из массива городов.
//fetch and predicate declaration...
let cities: [City] = try! context.fetch(request)
let countries = Set<Country>(cities.map({$0.country }))
Предполагается, что вы определили отношение, обратное к единице, от города к стране.
страны будут иметь целую кучу дублированных + это медленное
Никаких дубликатов при добавлении в набор, как это сделал я. Почему это будет так медленно по сравнению с вашим подзапросом?
Возможно, не по теме, но вам также следует создать противоположные отношения между городом и страной, отношения к одному.