【问题标题】:Using NSPredicate to filter out array of strings from NSManagedObject set property使用 NSPredicate 从 NSManagedObject 集合属性中过滤出字符串数组
【发布时间】:2020-05-26 03:20:16
【问题描述】:

假设我有一个 NSManagedObject 类型的 NSManagedObject 对象(从核心数据中获取)Game 和第二个对象 Genre,它只有一个属性 name

let games: [Game] = []

class Game: NSManagedObject {
    @NSManaged public var title: String?
    @NSManaged public var genres: NSOrderedSet?
    @NSManaged public var publishers: NSOrderedSet?
    @NSManaged public var tags: NSOrderedSet?
}

class Genre: NSManagedObject {
    @NSManaged public var name: String?
}

let genres: Set<String> = ["Racing", "Strategy", "Fighting"]

假设我有一个类似上述类型的Set,如何使用NSPredicate 从数组中过滤出游戏,其中集合中至少有一种类型与任何游戏中的标签匹配。还是我应该只做一个典型的 for 循环?

【问题讨论】:

  • 我很困惑。 “上面的流派集合”是集合var genres: NSOrderedSet?吗?是否要过滤至少一种游戏类型与任何游戏的任何标签匹配的游戏?
  • @Willeke 我有 Game 实体,它与 Genre 实体有一对多关系。我想从字符串数组中过滤掉与任何类型匹配的游戏。现在清楚了吗?
  • 是的,标签和流派混在一起了。请编辑问题并删除所有标签(问题中的“标签”一词,而不是问题的标签)。
  • @Willeke 对,已修复 :)
  • 尝试谓词NSPredicate(format: "ANY genres.name in %@", genres)

标签: arrays swift core-data nspredicate nsmanagedobject


【解决方案1】:

使用NSPredicate

let predicate = NSPredicate(format: "ANY genres IN %@", genres)

使用filter

let filtered = games.filter {
    !$0.genres.intersection(genres).isEmpty
}

【讨论】:

  • 当 Genre 是一个 NSManagedObject 类型的对象,它的属性是 String name 类型时,它如何工作? Game 实体中的流派也属于 NSManagedSet 类型?所以在这两种情况下都需要打开包装。
猜你喜欢
  • 2011-04-08
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多