使用NSPredicate搜索对象数组

 好1男1人_329 发布于 2023-02-09 22:10

我有一个被调用的类的实例数组Contact,其中包括以下属性:

NSArray *mailAddressList // Array of NSString
NSArray *websiteList // Array of NSString
NSArray *tags // Array of instances of Tag class

类标记具有以下属性:

NSString *name;
UIColor *color;

我想使用NSPredicate在每个属性的任何属性中搜索字符串Contact.这是我的代码:

if([scope isEqualToString:SCOPE_MAIL] || [scope isEqualToString:SCOPE_WEBSITE])
{
    // Search through an array
    predicate = [NSPredicate predicateWithFormat:@"ANY SELF.%@ contains[c] %@", scope, textSearch];
}
else if([scope isEqualToString:SCOPE_TAG])
{
    // Search another object's property
    predicate = [NSPredicate predicateWithFormat:@"SELF.%@.name contains[c] %@", scope, textSearch];
}
else
{
    // The rest of the properties are instances of NSString
    predicate = [NSPredicate predicateWithFormat:@"SELF.%@ contains[c] %@", scope, textSearch];
}

一切正常,除了SCOPE_TAG,它不返回任何值.我不认为我正确使用谓词.

注意:我是NSPredicate的新手,所以如果我正在做的事情不好,我想听听一些见解

1 个回答
  • 首先,如果你替换一个键路径,你应该使用%Karg.

    此外,我认为你错过了ANY第二个查询中的参数.如果任何标签名称包含您的结果,我想您想要一个结果textSearch.

    要更好地理解谓词的工作原理,请查看Apple文档

    我做了一个快速测试,它仍然工作正常:

    NSMutableArray *arrayContacts = [NSMutableArray array];
    
    {
        AMContact *contact = [[AMContact alloc] init];
        NSMutableArray *arrayTags = [NSMutableArray array];
        {
            AMTags *tag = [[AMTags alloc] init];
            tag.name = @"Test";
            [arrayTags addObject:tag];
        }
    
        {
            AMTags *tag = [[AMTags alloc] init];
            tag.name = @"Te2st2";
            [arrayTags addObject:tag];
        }
    
        {
            AMTags *tag = [[AMTags alloc] init];
            tag.name = @"No";
            [arrayTags addObject:tag];
        }
        contact.tags = [arrayTags copy];
        [arrayContacts addObject:contact];
    }
    
    {
        AMContact *contact = [[AMContact alloc] init];
        NSMutableArray *arrayTags = [NSMutableArray array];
        {
            AMTags *tag = [[AMTags alloc] init];
            tag.name = @"Test";
            [arrayTags addObject:tag];
        }
        contact.tags = [arrayTags copy];
        [arrayContacts addObject:contact];
    }
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY SELF.%K.name contains[c] %@", @"tags", @"Test"];
    
    NSArray *result = [arrayContacts filteredArrayUsingPredicate:pred];
    
    NSLog(@"%@", result);
    

    2023-02-09 22:25 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有