13

で複数の条件を使用する方法はNSPredicate

私はこれを使用していますが、返された配列には何も取得されていません。

NSPredicate *placePredicate = [NSPredicate predicateWithFormat:@"place CONTAINS[cd] %@ AND category CONTAINS[cd] %@ AND ((dates >= %@) AND (dates <= %@)) AND ((amount >= %f) AND (amount <= %f))",placeTextField.text,selectedCategory,selectedFromDate,selectedToDate,[amountFromTextField.text floatValue],[amountToTextField.text floatValue]];

NSArray *placePredicateArray = [dataArray filteredArrayUsingPredicate:placePredicate];

NSLog(@"placePredicateArray %@", placePredicateArray);

金額とカテゴリが空になる場合があります。どのように構築すればよいNSPredicateですか?

4

3 に答える 3

30

placesPredicate他のNSPredicateオブジェクトとNSCompoundPredicateクラスを使用してビルドできます

何かのようなもの :

NSPredicate *p1 = [NSPredicate predicateWithFormat:@"place CONTAINS[cd] %@", placeTextField.text];
NSPredicate *p2 = [NSPredicate predicateWithFormat:@"category CONTAINS[cd] %@", selectedCategory];
NSPredicate *p3 = [NSPredicate predicateWithFormat:@"(dates >= %@) AND (dates <= %@)", selectedFromDate,selectedToDate];
NSPredicate *p4 = [NSPredicate predicateWithFormat:@"(amount >= %f) AND (amount <= %f)", [amountFromTextField.text floatValue],[amountToTextField.text floatValue]]; 

NSPredicate *placesPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[p1, p2, p3, p4]];

たとえば、カテゴリが欠落している場合は、ダミーのYES述語を使用してカテゴリを置き換えることができます。

NSPredicate *p2;
if (selectedCategory) {
    p2 = [NSPredicate predicateWithFormat:@"category CONTAINS[cd] %@", selectedCategory];
} else {
    p2 = [NSPredicate predicateWithBool:YES]
}
于 2012-04-13T12:30:14.353 に答える
13

私はこれを少しずつ扱う傾向があります。あれは、

placePredicate = [NSPredicate predicateWithFormat:@"place CONTAINS[cd] %@",placeTextField.text];
NSMutableArray *compoundPredicateArray = [ NSMutableArray arrayWithObject: placePredicate ]; 

if( selectedCategory != nil ) // or however you need to test for an empty category
    {
    categoryPredicate = [NSPredicate predicateWithFormat:@"category CONTAINS[cd] %@",selectedCategory];
    [ compoundPredicateArray addObject: categoryPredicate ];
    }

// and similarly for the other elements.  

カテゴリ(または他の何か)の述語がないことがわかっている場合は、配列に述語を入れても気にしないことに注意してください。

// Then
    NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:
                                  compoundPredicateArray ];

そして、私がそれをたくさん行うことを計画しているなら、私はformatメソッドを使用しませんが、ビルディングブロックを維持し、使用ごとに変更を加えるだけです。

于 2012-04-13T12:35:08.487 に答える
0
Suppose a class Person with attributes "name", "age", "income"

"personArray" is array of class Person

NSPredicate *mypredicate = [NSPredicate predicateWithBlock:^BOOL(personObj Person, NSDictionary *bindings) {
     NSNumber *age = personObj.age;
     String *name = personObj.name;
     NSNumber *income = personObj.income
     BOOL result = (age > 20 && name == "Stack" && income >40000);
     return result;
}];

NSArray *filteredArray = [personArray filteredArrayUsingPredicate: mypredicate];

詳細については、この記事「ブロックを使用した配列フィルター」を参照してください。

スウィフトで

let filterArray = personArray.filter
            { person in
           let age = personObj.age;
           let name = personObj.name;
           let income = personObj.income
           BOOL result = (age > 20 && name == "Stack" && income >40000);
          return result;
        }
于 2016-02-11T11:14:39.560 に答える