将characterAtindex与目标C NSPredicate类一起使用

时间:2012-04-15 18:58:30

标签: objective-c ios nspredicate

我有一个字符串的pList,我将其绑定到NSMutable数组中。

NSString *path = [[NSBundle mainBundle] pathForResource:@"small" ofType:@"plist"];
_availableWords = [[NSMutableArray alloc]initWithContentsOfFile:path];

我想将字符串中的每个字符与指定字符进行比较,并使用结果创建一个新数组。

我可以使用下面的

过滤第一个和最后一个字符
NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF beginswith[cd] %@", @"B"];

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF endswith[cd] %@", @"B"];

但是当我尝试使用characterAtIndex方法检查两者之间的字符时,我收到错误。

NSPredicate *filter = [NSPredicate predicateWithFormat:@"SELF characterAtIndex:%i LIKE[cd] %@", 3, @"B"];

我知道我可能会循环遍历检查字符的每个单词,但是使用NSPredicate是非常整洁的,考虑到字符串列表可能非常大(超过100,000),应该会有更好的性能。

有人能告诉我使用带有NSPredicate的characterAtIndex或有任何其他解决方案想法的正确语法吗?

更新:根据以下Kens的回答,我现在使用以下代码来检查第一个和最后一个字符之外的字符。例如,下面检查第4个字符。

NSArray *matches = [_availableWords objectsAtIndexes:[_availableWords indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    return (BOOL)([obj characterAtIndex:3] == 'R');
}]];

但是,当我在调试器中检查匹配数组时,我看到以下错误

matches NSArray *   0x06a67ba0 @"Variable is not a CFArray"

并且数组中没有对象。根据short.pList中的示例数据,我希望在数组中看到一个对象。

提前感谢您的帮助, 真皮

1 个答案:

答案 0 :(得分:4)

内置谓词不支持此类操作。但是,您可以构建一个用于计算块的谓词:

NSPredicate* filter = [NSPredicate predicateWithBlock:^(id evaluatedObject, NSDictionary *bindings){
    return (BOOL)([evaluatedObject characterAtIndex:3] == 'B');
}];

或者,如果您只是转而使用此谓词过滤数组,则可以删除中间人并使用块直接识别数组的元素:

NSArray* matches = [array objectsAtIndexes:[array indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    return (BOOL)([obj characterAtIndex:3] == 'B');
}]];