NSPredicate对复杂对象数组进行过滤

时间:2018-09-17 08:28:37

标签: objective-c swift nspredicate

所以,基本上,问题是,我有一个对象,我们称它为“产品”

struct Product {
  let categories: [Category]
}

类别如下:

struct Category {
  let id: Int
}

我需要的是创建NSPredicate,它将检查类别列表是否包含某些ID的类别。现在确定是否有可能,但是也许比使用简单的Int数组创建另一个属性更好的解决方法? 更新:NSPredicate是强制性的,因为我需要在Realm数据库过滤器查询中使用它。

3 个答案:

答案 0 :(得分:2)

NSPredicate的正确格式为:

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

上面的示例将返回其Products数组包含categories为1的Product的所有id

当然,这是假设您只在寻找单个id的类别。如果您需要检查多个ids,则可以使用OR修改以上内容。

注意:我使用NSArray而非Realm测试了上述谓词。但是,如果您检查Realm谓词备忘单,则它确实支持该谓词正在使用的所有运算符:

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

答案 1 :(得分:0)

如果您使用的是Swift,则可以使用filter并包含方法来过滤数组。

当您拥有包含产品的数组时,可以通过以下方式对其进行过滤:

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

上面的代码过滤包含id = 1类别的产品

答案 2 :(得分:0)

您可以简单地检查通过筛选类别返回的数组的计数。

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)

希望有帮助