为啥 NS 谓词无法解析我对 NSArray 索引的条件语句

Posted

技术标签:

【中文标题】为啥 NS 谓词无法解析我对 NSArray 索引的条件语句【英文标题】:Why does NS predicate failing to parse my conditional statement on NSArray Index为什么 NS 谓词无法解析我对 NSArray 索引的条件语句 【发布时间】:2018-04-15 09:33:04 【问题描述】:

我正在使用 jsonSerialization 通过 api 检索 Web 数据。

NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData: responseData options: NSJSONReadingMutableContainers error: &e]; 

然后我可以使用以下谓词获得所需的数据。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"value == 1 && day = 0"]; 
NSArray *filteredArray = [[jsonArray filteredArrayUsingPredicate:predicate] valueForKey:@"hour"];

这给了我一个我想要的数据的过滤数组。

filteredArray = (0, 1, 2, 7, 8, 9, 14, 15, 16, 17)

我需要从这个过滤数组中提取所有连续数字的开始和结束。例如在上面的数组中,这些是 (0, 2, 7, 9, 14, 18)。我试图通过将数组索引作为条件传递,在我的过滤数组上使用第二个谓词来实现这一点。

 NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"if (filteredArray[1] - filteredArray[0] !=0)"]; 

这使我的程序崩溃。我以为我可以通过这种方式将数组索引传递给谓词?

【问题讨论】:

您的第一个谓词获取value == 1 && day = 0 所在的每个数组元素。谓词无法获取每个filteredArray 元素,其中if (filteredArray[1] - filteredArray[0] !=0)。见Predicate Programming Guide 和Predicate Format String Syntax。 类似问题:Group consecutive/sequential numbers from array into string. 【参考方案1】:

NSPredicate 是过滤范围的错误 API。

我建议将索引转换为NSIndexSet 并枚举范围

NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
for (NSNumber *index in filteredArray) 
    [indexSet addIndex:index.unsignedIntegerValue];

[indexSet enumerateRangesUsingBlock:^(NSRange range, BOOL * _Nonnull stop) 
     NSLog(@"%ld, %ld", range.location, range.length);
];

【讨论】:

以上是关于为啥 NS 谓词无法解析我对 NSArray 索引的条件语句的主要内容,如果未能解决你的问题,请参考以下文章

解析PFQuery谓词指针对象

如何根据 nsarray 过滤谓词

无法将双精度的 NSArray 保存到文件 ios

在 NSArray 中设置值

核心数据谓词根据关系获取数据,错误为无法解析格式字符串

在Object-C 中的 NSArray,NSString…… NS到底是啥??