加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

objective-c – 使用NSPredicate搜索对象数组

发布时间:2020-12-16 05:00:03 所属栏目:百科 来源:网络整理
导读:我有一个名为Contact的类的实例数组,其中包含以下属性: NSArray *mailAddressList // Array of NSStringNSArray *websiteList // Array of NSStringNSArray *tags // Array of instances of Tag class 类标记具有以下属性: NSString *name;UIColor *color;
我有一个名为Contact的类的实例数组,其中包含以下属性:
NSArray *mailAddressList // Array of NSString
NSArray *websiteList // Array of NSString
NSArray *tags // Array of instances of Tag class

类标记具有以下属性:

NSString *name;
UIColor *color;

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

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] %@",textSearch];
}
else
{
    // The rest of the properties are instances of NSString
    predicate = [NSPredicate predicateWithFormat:@"SELF.%@ contains[c] %@",textSearch];
}

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

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

解决方法

首先,如果你替换一个键路径,你应该使用%K作为arg.

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

为了更好地理解谓词的工作原理,请查看Apple Documentation

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

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读