【问题标题】:Swift NSPredicate init.block() bindings exampleSwift NSPredicate init.block() 绑定示例
【发布时间】:2019-10-31 05:04:39
【问题描述】:

NSPredicate init with block 定义如下:

init(block: @escaping (Any?, [String : Any]?) -> Bool)

但我无法理解绑定参数的用法,该参数在该签名中作为可选字典显示:[String : Any]?

Apple's documentation,没有多大帮助。

我能否获得一个关于如何在谓词中使用 bindings 参数的示例,例如 CoreData 搜索?

【问题讨论】:

  • 注意:“在 macOS 10.6 及更高版本中,Core Data 在内存和原子存储中支持基于块的谓词,但在基于 SQLite 的存储中不支持。”
  • Creating Predicates Using Predicate Templates。你想使用替换变量吗?
  • @Willeke 我明白了,我刚刚运行了我的代码,是的,它似乎不喜欢 sqlite 级别的块谓词。
  • @Willeke 有机会我会看看那个链接。
  • 据我所知,该链接与阻止谓词没有任何关系。

标签: swift core-data nspredicate nsfetchrequest


【解决方案1】:

这是一个例子(没有意义,只是为了演示):

let string = "abc"
let templatePredicate = NSPredicate(block: { (object, bindings) in
  return true
})
let ok = templatePredicate.evaluate(with: string, substitutionVariables: ["key": "value"])  

如果您在 Xcode 下执行此代码,并在谓词块中的 return true 语句处设置断点,您会得到以下结果:

Printing description of object:
▿ Optional<Any>
  - some : abc  

Printing description of bindings:
▿ Optional<Dictionary<String, Any>>
  ▿ some : 1 element
    ▿ 0 : 2 elements
      - key : "key"
      - value : "value"  

显然,这个想法是templatePredicate 是一个可重用的谓词,可以通过在评估谓词时指定一个具体的替换变量字典来适应各种情况。然后可以根据需要在块中使用这些替换变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-10
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多