gpt4 book ai didi

ios - 使用 NSPredicate 的 predicateWithFormat : 时“无法解析格式字符串 "function == %@"”

转载 作者:行者123 更新时间:2023-11-29 04:01:33 25 4
gpt4 key购买 nike

我正在尝试通过“function”属性搜索NSArray。我在控制台打印数组时的输出如下:

<__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]]];

但是当我尝试使用以下代码(通过函数搜索)时,抛出了异常:

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

异常(exception)是:

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

我在这里做错了什么?

最佳答案

Apple 的 Predicate Programming Guide声明“Cocoa 中的谓词表达式由 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;
}
)

以这种方式构造谓词可能会稍微多一些工作,但可以防止将来出现这些类型的冲突。前进的一个好习惯是将格式字符串限制为仅包含格式说明符和谓词语法,在运行时最终确定谓词的表达式字符串。

关于ios - 使用 NSPredicate 的 predicateWithFormat : 时“无法解析格式字符串 "function == %@"”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801537/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com