【问题标题】:Using NSPredicate's `array[FIRST]` operator使用 NSPredicate 的 `array[FIRST]` 运算符
【发布时间】:2017-02-28 23:00:47
【问题描述】:

我在 Apple 的 documentation 中看到有一个 array[FIRST] 运算符,这正是我编写我想要的谓词所需要的。不幸的是,文档没有提供任何示例,我看不出如何将其清楚地放在谓词中。

所以,例如,我会有类似[NSPredicate predicateWithFormat:@"array[FIRST] IN %@", @[@1, @2, @3] 的东西。当然,这会引发异常:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFConstantString 0x100001058> valueForUndefinedKey:]: this class is not key value coding-compliant for the key array.'

因为这个谓词最终会进入核心数据模型文件,我需要用字符串格式表示它,所以任何涉及代码的解决方案都行不通。

【问题讨论】:

  • 该错误表明正在根据字符串而不是 CoreData 托管对象评估谓词。您能否提供模型的更多细节以及您想要实现的目标?
  • @pbasdf 我理解错误。那不是我的问题。问题是如何在给定谓词的情况下正确地从数组中提取第一个元素。 Core Data 是这个问题的附带条件。
  • 您要从哪个数组中提取元素?托管对象数组?
  • 没错。这将是 xcdatamodel 文件中实体上的已获取属性。
  • 好的。所以你希望你获取的属性是“第一个匹配这个谓词的对象”?如果是这样,我认为它不能做到:a)获取的属性总是返回一个数组(即使只有一个对象匹配),b)模型编辑器不会让你为 FP 指定排序顺序,所以你正在寻找第一个匹配对象的运气。

标签: ios objective-c core-data nspredicate


【解决方案1】:

在替换格式字符串中的%@ 值并将SELF 替换为正在评估的对象后,谓词需要有意义。您的谓词说:“在文字数组 1,2,3 中包含的 未知符号 'array' 中的第一个对象是什么?”

考虑以下示例...

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF[FIRST] == %@", @1];
BOOL result = [predicate evaluateWithObject:@[@1, @2, @3]];
// result will be YES

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF[FIRST] == %@", @2];
BOOL result = [predicate evaluateWithObject:@[@1, @2, @3]];
// result will be NO

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@[FIRST] == SELF", @[@1, @2, @3]];
BOOL result = [predicate evaluateWithObject:@1];
// result will be YES

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%@[FIRST] == SELF", @[@1, @2, @3]];
BOOL result = [predicate evaluateWithObject:@2];
// result will be NO

【讨论】:

    猜你喜欢
    • 2017-02-18
    • 2018-02-21
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    相关资源
    最近更新 更多