【问题标题】:Using characterAtindex with objective C NSPredicate class将 characterAtindex 与目标 C NSPredicate 类一起使用
【发布时间】:2012-04-15 18:58:29
【问题描述】:

我有一个 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 NSArray *   0x06a67ba0 @"Variable is not a CFArray"

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

提前感谢您的帮助, 真皮

【问题讨论】:

    标签: objective-c ios nspredicate


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢肯,是的,我只想用这个谓词过滤一个数组。当我尝试上面的第二个代码块时,我收到以下错误 - 不兼容的块指针类型将 'int (^)(__strong id, NSUInteger, BOOL *)' 发送到类型为 'BOOL (^)(__strong id, NSUInteger, BOOL *)'。有什么想法吗?
    • 我已经调整了示例以强制返回类型为 BOOL。
    • 感谢 Ken,感谢您提供的所有帮助。这看起来正是我想要的。如果这是一个愚蠢的问题,我深表歉意——我是 Objective C 的新手——但我现在收到一个错误“变量不是 CFArray”。在我检索并捆绑我的 pList 后,我​​将这些值放入 NSMutableArray 中,我正在尝试过滤这个 NSMutableArray。
    • 不客气。用一些代码更新您的问题,显示您在做什么以及确切的错误。
    • 看起来只是调试器的一个问题 - 当我进入下一行代码时,我看到数组中的对象数量正确。一旦我整理代码并对其进行测试,我将发布方法解决方案。再次感谢肯的所有帮助!
    猜你喜欢
    • 2021-04-13
    • 2018-02-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多