2013-04-04 32 views
0

我试图通过'function'属性搜索NSArray。当我打印在控制台上阵列的输出如下:使用NSPredicate的predicateWithFormat时'无法解析格式字符串'函数==%@“':

<__NSArrayI 0xa523b40>(
{ 
    category = "010-T"; 
    description = "<h3>Opleidingen</h3>"; 
    function = "T-r"; 
    name = "Michal Jordan"; 
    photo = "http://dws.com/34.jpg"; 
}, 
{ 
    category = "010-T"; 
    description = "abcd"; 
    function = "AB"; 
    name = "Pvt MSK"; 
    photo = "http://test.com/3.jpg"; 
}, 
{ 
    category = "010-T"; 
    description = "def"; 
    function = "T-r"; 
    name = "Sanu M"; 
    photo = "http://abc.com/1.jpg"; 
} 
) 

此代码,它通过“category”搜索,工作原理:

NSString *categoryStr = @"010-T"; 
NSArray *arr = [NSArray arrayWithArray:[myarr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"category == %@",categoryStr]]]; 

但是,当我用下面的代码尝试(搜索通过function),引发了异常:

NSString *functionStr = @"T-r"; 
NSArray *arr = [NSArray arrayWithArray:[myarr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"function == %@",functionStr]]]; 

唯一的例外是:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unable to parse the format string "function == %@"' 

所以它看起来在这里,function是一个保留关键字。

我试过下面的代码,用单引号将function打包,但结果是arr有0个对象。

NSArray *arr = [NSArray arrayWithArray:[myarr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"'function' == %@",functionStr]]]; 

我在这里做错了什么?

+0

有趣。也许尝试“self.function == [cd]%@”假设它是一个自定义类的数组。 – Jeremy 2013-04-04 02:42:22

+0

是的,这很有趣,它是一个keyvalue对的数组,而你以后的解决方案给我错误如下:无法解析格式字符串“self.function == [cd]%@”,同样的权利? – 2013-04-04 02:48:14

+0

另一件事,似乎功能是保留字,如果我尝试使用“名称”关键字,它正在工作.. – 2013-04-04 02:49:09

回答

2

Apple的Predicate Programming Guide指出“可可中的谓词表达式由NSExpression的实例表示。”请注意,NSExpression提供了一种语法,可以通过FUNCTION关键字调用方法调用。 The docs将语法定义为FUNCTION(receiver, selectorName, arguments, ...)。虽然我在任何文档中都没有找到这个参考,但看起来这个特性不包括在其他上下文中使用文字词的功能。

幸运的是,您可以使用%K格式说明符(用于键名称)以替代方式构建谓词格式字符串。例如,[NSPredicate predicateWithFormat:@"%K == %@", @"function", @1]不会引发异常并能正常工作。看到它在行动以下代码:

NSDictionary *dict1 = @{@"otherKey": @1, @"function" : @2}; 
    NSDictionary *dict2 = @{@"otherKey": @2, @"function" : @1}; 
    NSArray *array = @[dict1, dict2]; 
    NSPredicate *otherKeyPredicate = [NSPredicate predicateWithFormat:@"%K == %@",@"otherKey", @1]; 
    NSArray *filteredByOtherKey = [array filteredArrayUsingPredicate:otherKeyPredicate]; 
    NSPredicate *functionPredicate = [NSPredicate predicateWithFormat:@"%K == %@", @"function", @1]; 
    NSArray *filteredByFunction = [array filteredArrayUsingPredicate:functionPredicate]; 
    NSLog(@"filteredByOtherKey = %@", filteredByOtherKey); 
    NSLog(@"filteredByFunction = %@", filteredByFunction); 

我们得到的控制台上的输出如下:

filteredByOtherKey = (
     { 
     function = 2; 
     otherKey = 1; 
    } 
) 
filteredByFunction = (
     { 
     function = 1; 
     otherKey = 2; 
    } 
) 

构建谓词这样可能会稍微更多的工作,但会避免此类冲突未来。向前推进的一个好的做法是限制格式字符串仅包含格式说明符和谓词语法,在运行时完成prediate的表达式字符串。

+0

是的,这是答案。NSPredicate * predicate = [NSPredicate predicateWithFormat:@“%K like%@”, attributeName,attributeValue]; ,,,谢谢你解决我的问题 – 2013-04-04 06:31:14

-1
NSString *functionStr = @"T-r"; 
NSArray *arr = [myarr filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(function == %@)",functionStr]]; 


Here myarr is NSMutableArray. 
Try with this code.