ios使用filteredArrayUsingPredicate NSPredicate与NSString无法正常工作

时间:2013-06-28 18:51:26

标签: iphone ios nsstring nspredicate

我正在使用获取nsmutable数组的一些内容,如果我不使用nsstring来进行查询,它可以正常工作:

NSLog(@"user information %@", [usersInfo filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%K == 'Joe", @"id"]]);

但是尝试使用nsstring来查询它不起作用的用户:

NSString *user="Joe";

NSLog(@"user information %@", [usersInfo filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%K == user", @"id"]]]);

你们中任何人都知道我做错了什么?或者使用NSString查询用户最好的做法是什么?

5 个答案:

答案 0 :(得分:1)

写作时

NSString *user = @"Joe";
... [NSPredicate predicateWithFormat:@"%K == user", @"id"]

您似乎期望谓词中的“user”被NSString变量的内容(“Joe”)替换,但这不正确。

你必须给出字符串 作为谓词的另一个参数,并添加将由字符串扩展的%@格式。

NSString *user = @"Joe";
... [NSPredicate predicateWithFormat:@"%K == %@", @"id", user]

此处%K(对于密钥路径的var arg替换)将是 由密钥"id"%@替换(即 var arg替换对象值)将被替换 通过user变量的内容。

使用%K扩展代替

[NSPredicate predicateWithFormat:@"id == %@", user]

具有即使密钥是a也能正常工作的优点 谓词格式字符串语法中的保留字。

答案 1 :(得分:0)

我无法理解您使用"%K == 'Joe"

的原因

无论如何,你可以使用谓词:

[NSPredicate predicateWithFormat:@"object.property LIKE[c] %@", stringValue];

或者,

[NSPredicate predicateWithFormat:@"object.property==[c] %@", stringValue];

答案 2 :(得分:0)

试试这个:

NSString *user="Joe";

NSLog(@"user information %@", [usersInfo filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF contains [cd] %@", user]]]);

答案 3 :(得分:-1)

在不尝试在谓词格式中添加属性名称之前,请创建谓词格式字符串:

NSString *predicateFormat = [NSString stringWithFormat:@"%@ == %%@",@"id"];
NSPredicate *predicate = [NSPredicate predicateWithFormat: predicateFormat, @"Joe"];
NSArray *filteredArray = [mutableArray filteredArrayUsingPredicate:predicate];

答案 4 :(得分:-2)

使用:

NSLog(@"user information %@", [usersInfo filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"%K == '%@'",@"id",user]]]);

使用时:

NSLog(@"user information %@", [usersInfo filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%K == user", @"id"]]]);"

用户将成为字符串的一部分,它不会替换为NSString对象的内容。