gpt4 book ai didi

objective-c - 将 characterAtindex 与 Objective-C NSPredicate 类一起使用

转载 作者:行者123 更新时间:2023-11-28 19:19:22 28 4
gpt4 key购买 nike

我有一个字符串 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),性能应该好得多。

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

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

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

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

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

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

在此先感谢您的帮助,皮肤

最佳答案

内置谓词不支持这样的操作。但是,您可以构建一个评估 block 的谓词:

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

或者,如果你只是想转过来用这个谓词过滤一个数组,你可以去掉中间人并使用一个 block 直接识别数组的元素:

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

关于objective-c - 将 characterAtindex 与 Objective-C NSPredicate 类一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10165066/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com