【问题标题】:Swift 3: Use NSPredicate(format:) to filter objects by type/classSwift 3:使用 NSPredicate(format:) 按类型/类过滤对象
【发布时间】:2017-12-08 03:35:02
【问题描述】:

我遇到了一个关于 NSPredicate 语法的问题。我想按类类型过滤一组对象。

class ClassA: NSObject {}
class ClassB: ClassA {}
class ClassC: ClassA {}

let array: [ClassA] = [ClassB(), ClassC()]

现在我想使用 NSPredicate 来获取仅包含 ClassB 项的过滤数组。

我可以使用 Blocks 来做到这一点,它会是这样的:

let predicate = NSPredicate { (object, nil) -> Bool in
    return object is ClassB
}

虽然这是一种合法的方法,但我也想对 NSPredicate(format:) 做同样的事情。

在其他尝试中,我尝试了以下失败:

let predicate = NSPredicate(format: "self = %@", [ClassB.self])
let predicate = NSPredicate(format: "SELF isKindOfClass: %@", [ClassB.self])

我认为这一定只是一个语法问题,但我正在寻找一个多小时来解决这个问题。

提前致谢。

【问题讨论】:

  • 为什么不用原生的Swift方式array.filter{ $0 is ClassB }
  • @vadian 我想创建更复杂和动态的复合谓词
  • 你也可以使用 Swift 函数来做到这一点。
  • @Palle 我试过let predicate = NSPredicate(format: "class == %@", [ClassB.self]) 没有结果。我认为它不是重复的,因为我正在寻找 swift 3 对应物。

标签: ios swift swift3 nspredicate


【解决方案1】:

这应该可行:

let predicate = NSPredicate(format: "class = %@", ClassB.self)

这是一个关于谓词的文档页面 - https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html#//apple_ref/doc/uid/TP40001793-CJBDBHCB

【讨论】:

  • 感谢您的回答。但是当我这样做时,我收到错误“参数类型'ClassB.Type'不符合预期的类型'CVarArg'”
  • @stoikr 你确定 ClassA 是 NSObject 的子类吗?
  • 在我的代码库中它实际上是一个 NSManagedObject,它是 NSObject 的子类
  • @stoikr 尝试将显式转换添加到 CVarArg - ClassB.self 作为 CVarArg。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 2012-05-17
  • 1970-01-01
  • 2017-03-16
相关资源
最近更新 更多