我有一个字符串的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中的示例数据,我希望在数组中看到一个对象。
提前感谢您的帮助, 真皮
答案 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');
}]];