0

NSComparisonPredicate を使用して、配列内の文字列が空かどうかを確認する必要があります。実行されている述語は次のとおりです。 string MATCHES[c] "" しかし、結果には何も表示されず、空の文字列がリストされません。私の述語は間違っていますか、それとも NSPredicate で空の文字列を処理する別の方法がありますか?

4

3 に答える 3

1

NSComparisonPredicate を使用している理由がわかりません。使用したことがないため、よくわかりません。predicateWithFormat を試しましたか?

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

述語をどのように使用するかは明確ではありませんが、配列をフィルター処理するために使用している場合、これは機能するはずです。

空の配列内の文字列のインデックスを知りたい場合は、次のように indexsOfObjectsPassingTest: を使用できます。

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 に答える