Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 使用NSPredicate在对象数组中搜索_Objective C_Nspredicate - Fatal编程技术网

Objective c 使用NSPredicate在对象数组中搜索

Objective c 使用NSPredicate在对象数组中搜索,objective-c,nspredicate,Objective C,Nspredicate,我有一个名为Contact的类的实例数组,该类具有以下属性: NSArray *mailAddressList // Array of NSString NSArray *websiteList // Array of NSString NSArray *tags // Array of instances of Tag class NSString *name; UIColor *color; class标记具有以下属性: NSArray *mailAddressList // Array

我有一个名为
Contact
的类的实例数组,该类具有以下属性:

NSArray *mailAddressList // Array of NSString
NSArray *websiteList // Array of NSString
NSArray *tags // Array of instances of Tag class
NSString *name;
UIColor *color;
class标记具有以下属性:

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] %@", scope, textSearch];
}
else
{
    // The rest of the properties are instances of NSString
    predicate = [NSPredicate predicateWithFormat:@"SELF.%@ contains[c] %@", scope, textSearch];
}
除了
SCOPE\u标记
,其他一切正常,它不返回任何值。我认为我没有正确使用谓词


注意:我是NSPredicate的新手,所以我想听听我的见解,如果我做的不好

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

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

为了更好地理解谓词是如何工作的,请查看

我做了一个快速测试,它仍然运行良好:

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

无法100%确定这是否是导致问题的原因,但您应该使用键路径的
%K
格式说明符,而不是
%@
。例如,
SCOPE\u标记
的格式字符串将是
SELF.%K.name包含[c]%@“
。谢谢您的评论。我将其更改为
%K
,但行为没有更改。您是否错过了第二个谓词语句中的
ANY
?我想您需要检查数组中是否有任何标记名包含文本…谢谢!它现在工作得很好。我以前一定犯过错误,因为我尝试使用
ANY
,但我得到一个异常,即运算符不能使用,因为它不是集合。这让我觉得
ANY
只能用于数组、集合等。