NSPredicate фильтрация по массиву сложных объектов - PullRequest
0 голосов
/ 17 сентября 2018

Итак, в основном проблема в том, что у меня есть объект, назовем его «Продукт»

struct Product {
  let categories: [Category]
}

И категория выглядит так:

struct Category {
  let id: Int
}

Что мне нужно,это создать NSPredicate, который бы проверял, содержит ли список категорий категорию определенного идентификатора.Теперь уверен, если это возможно, но, возможно, есть лучший обходной путь, чем создание другого свойства с простым массивом Int?Обновление: NSPredicate является обязательным, потому что мне нужно использовать его в запросе фильтра базы данных Realm.

Ответы [ 3 ]

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

Вы можете просто проверить количество массивов, возвращаемых фильтром категорий.

struct Product {
  let categories: [Category]
}

struct Category {
  let id: Int
}

let c1 = Category(id: 1)
let c2 = Category(id: 2)
let c3 = Category(id: 3)

let p = Product(categories: [c1, c2, c3])
let yourCategoryId = 1
let filteredResults = p.categories.filter {
    $0.id == yourCategoryId
}
let isCategoryWithIdPresent = filteredResults.count > 0 ? true : false
print(isCategoryWithIdPresent)

Надеюсь, это поможет

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

Правильный формат для вашего NSPredicate будет:

let predicate = NSPredicate(format: "ANY categories.id == %@", argumentArray: [1])

В приведенном выше примере будут возвращены все Products, чей массив categories содержит Product с id 1.

Конечно, это предполагает, что вы ищете только категории одного id.Если вам нужно было проверить несколько ids, вы можете изменить вышеприведенное с помощью OR.

Примечание: я тестировал вышеупомянутый предикат с NSArray, а не с Realm.Тем не менее, если вы проверяете таблицу предикатов Realm, она поддерживает все операторы, которые использует предикат:

https://academy.realm.io/posts/nspredicate-cheatsheet/?_ga=2.32752254.1161432538.1537175891-1199086799.1527592477

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

Если вы используете Swift, вы можете использовать фильтр и метод для фильтрации массивов.

Если у вас есть массив с продуктами, вы можете отфильтровать его по:

let filteredProducts = products.filter{ $0.categories.contains(where: { $0.id == 1 })}

Приведенный выше код фильтрует товары, содержащие категорию с id = 1

...