0

我有一个字符串 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"];

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

谁能告诉我将 characterAtIndex 与 NSPredicate 一起使用的正确语法或有任何其他解决方案的想法?

更新:根据下面的 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 中的示例数据,我希望在数组中看到一个对象。

在此先感谢您的帮助,德姆

4

1 回答 1

4

The built in predicates don't support such an operation. However, you can build a predicate which evaluates a block:

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

Or, if you're just going to turn around and filter an array with this predicate, you can cut out the middleman and use a block to identify elements of an array directly:

NSArray* matches = [array objectsAtIndexes:[array indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop){
    return (BOOL)([obj characterAtIndex:3] == 'B');
}]];
于 2012-04-15T19:54:08.507 回答