0

我需要使用 NSComparisonPredicate 检查数组中的字符串是否为空。正在执行的谓词是: string MATCHES[c] "" 但是结果中没有显示任何内容,它没有列出我的空字符串。我的谓词是错误的,还是有另一种使用 NSPredicate 处理空字符串的方法?

4

3 回答 3

1

我不确定你为什么使用 NSComparisonPredicate ,我从来没有使用过那个,所以我不熟悉它。您是否尝试过 predicateWithFormat ?

NSPredicate *pred = [NSPredicate predicateWithFormat:@"self.length == 0"];

目前尚不清楚您想如何使用谓词,但如果您使用它来过滤数组,这应该可以工作。

如果您想知道数组中空字符串的索引,则可以使用 indexOfObjectsPassingTest: 如下所示:

NSIndexSet *indxs = [array indexesOfObjectsPassingTest:^BOOL(NSString *aString, NSUInteger idx, BOOL *stop) {
        return aString.length == 0;
    }];
    NSLog(@"%@",indxs);
于 2012-06-04T18:04:28.227 回答
1

正如rdelmar上面提到的,对于这样的任务,您应该只检查字符串的长度string.length==0

于 2012-06-02T08:06:08.200 回答
0

您可以使用块过滤阵列。我建议不要使用 NSPredicate 的方法。这是一些示例代码:

//creating array
NSArray *myArray = [NSArray arrayWithObjects:@"a", @"b", @"", @"c", nil];

//filtering 
NSIndexSet *iset = [myArray indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    NSString *str = obj;
    return !str.length;
}
];

//creating my result array with empty strings
NSArray *emptyStrings = [myArray objectsAtIndexes:iset];

//logging all strings
for (NSString *str in myArray) {
    NSLog(@"string: %@", str);
}

//logging empty strings
for (NSString *str in emptyStrings) {
    NSLog(@"empty string: %@", str);
}

编辑: 如果你真的需要使用 NSComparisonPredicate,这里是:

NSExpression *left = [NSExpression expressionForKeyPath:@"length"];
NSExpression *right = [NSExpression expressionForConstantValue:[NSNumber numberWithInt:0]];

NSComparisonPredicateModifier modifier = NSDirectPredicateModifier;
NSPredicateOperatorType operator = NSEqualToPredicateOperatorType;

NSPredicate *predicate = [NSComparisonPredicate predicateWithLeftExpression:left rightExpression:right modifier:modifier type:operator options:0];

NSArray *filtered = [myArray filteredArrayUsingPredicate:predicate];
于 2012-06-02T08:43:22.643 回答