Objective c 将characterAtindex与目标C预测类一起使用

Objective c 将characterAtindex与目标C预测类一起使用,objective-c,ios,nspredicate,Objective C,Ios,Nspredicate,我有一个字符串列表,我正在将其捆绑到一个NSMutable数组中 NSString *path = [[NSBundle mainBundle] pathForResource:@"small" ofType:@"plist"]; _availableWords = [[NSMutableArray alloc]initWithContentsOfFile:path]; 我想将字符串中的每个字符与指定的字符进行比较,并使用结果创建一个新数组 我可以使用下面的方法过滤第一个和最后一个字符 NSP

我有一个字符串列表,我正在将其捆绑到一个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要整洁得多,而且考虑到字符串列表可能非常大(超过100000个),性能应该会更好

有没有人能告诉我在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中的示例数据,我希望在数组中看到一个对象

提前感谢您的帮助,
Derm

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

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');
}]];

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

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');
}]];

谢谢Ken,我只想用这个谓词过滤数组。当我尝试上面的第二个代码块时,我得到了以下错误-不兼容的块指针类型将int(^)(强id,NSUInteger,BOOL*)发送到类型为BOOL(^)(强id,NSUInteger,BOOL*)的参数。有什么想法吗?我已经调整了示例以强制返回类型为BOOL。谢谢Ken,感谢所有的帮助。这看起来正是我想要的。如果这是一个愚蠢的问题,我深表歉意-我对Objective C有点生疏-但我现在得到一个错误“变量不是CFArray”。在检索并捆绑我的pList之后,我将这些值放入一个NSMutableArray中,我正试图筛选这个NSMutableArray。不客气。用一些代码更新你的问题,显示你在做什么以及确切的错误。看起来这只是调试器的问题-当我转到下一行代码时,我看到数组中的对象数是正确的。一旦我整理代码并进行测试,我将发布方法解决方案。再次感谢你的帮助,肯!谢谢Ken,我只想用这个谓词过滤数组。当我尝试上面的第二个代码块时,我得到了以下错误-不兼容的块指针类型将int(^)(强id,NSUInteger,BOOL*)发送到类型为BOOL(^)(强id,NSUInteger,BOOL*)的参数。有什么想法吗?我已经调整了示例以强制返回类型为BOOL。谢谢Ken,感谢所有的帮助。这看起来正是我想要的。如果这是一个愚蠢的问题,我深表歉意-我对Objective C有点生疏-但我现在得到一个错误“变量不是CFArray”。在检索并捆绑我的pList之后,我将这些值放入一个NSMutableArray中,我正试图筛选这个NSMutableArray。不客气。用一些代码更新你的问题,显示你在做什么以及确切的错误。看起来这只是调试器的问题-当我转到下一行代码时,我看到数组中的对象数是正确的。一旦我整理代码并进行测试,我将发布方法解决方案。再次感谢你的帮助,肯!