gpt4 book ai didi

NSPredicate 用于多词搜索

转载 作者:行者123 更新时间:2023-12-03 18:29:32 27 4
gpt4 key购买 nike

在我的 iOS 应用程序中,我的获取 Controller 有一个非常简单的谓词。

NSString *format = [NSString stringWithFormat:@"name like[c] '%@'", nameVar];
NSPredicate *predicate = [NSPredicate predicateWithFormat:format];
[fetchController setPredicate:predicate];

它执行基本的不区分大小写的名称查找。现在我想更改它,以便我可以在搜索框中放入多个单词(nameVar 具有搜索框中的值),并用空格分隔,并让谓词过滤与所有这些关键字匹配的结果。

所以如果我有两个名字:“John Smith”和“Mary Smith”并且我搜索:“Smith M”我只想得到一个结果,但像这样的搜索:“Sm th ith”应该返回两个值。

有人知道应该如何实现吗?

最佳答案

在普通计算机上编辑...

因此有几件事需要注意:

  1. 您不需要在格式字符串中的替换占位符两边加上引号。当该方法构建谓词时,它将创建 NSExpressionNSPredicate 的抽象语法树(特别是 NSComparisonPredicateNSCompoundPredicate ) 对象。您的字符串将被放入 NSConstantValueExpressionType 类型的 NSExpression 中,这意味着它已经将被解释为常规字符串。事实上,将单引号放在格式字符串中将使您的谓词不起作用。
  2. 您不限于谓词中的单一比较。从它的声音来看,您希望进行与搜索字符串 (nameVar) 中的“单词”一样多的比较。在这种情况下,我们会将 nameVar 分解为其组成词,并为每个词创建比较。完成此操作后,我们将它们AND组合在一起以创建一个总体谓词。下面的代码正是这样做的。

原始答案

您可以通过构建自己的 NSCompoundPredicate 来做到这一点:

NSString *nameVar = ...; //ex: smith m
NSArray *names = ...; //ex: John Smith, Mary Smith

NSArray *terms = [nameVar componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSMutableArray *subpredicates = [NSMutableArray array];

for(NSString *term in terms) {
if([term length] == 0) { continue; }
NSPredicate *p = [NSPredicate predicateWithFormat:@"name contains[cd] %@", term];
[subpredicates addObject:p];
}

NSPredicate *filter = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];
[fetchController setPredicate:filter];

警告:在我的 iPhone 上的浏览​​器中输入。

关于NSPredicate 用于多词搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4993717/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com