1

NSPredicate構文に精通していません。次のコード行は、私が望むことを実行します。しかし、もっと簡潔な方法があるのではないかと思います。

さらに、NSPredicate構文に関するチートシートは大歓迎です。NSPredicateに関するAppleのドキュメントは、実用的な目的でははるかに複雑に思えます。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.name CONTAINS[cd] %@ OR SELF.city CONTAINS[cd] %@ OR SELF.state CONTAINS[cd] %@",aString, aString, aString];
4

2 に答える 2

0

あなたが持っているものは大丈夫です。このような単純な目的のために、述語を「改善」または単純化できる方法はたくさんあるとは思いません。

于 2012-09-12T12:52:04.670 に答える
0

NSPredicate のサブクラスを使用できますNSCompoundPredicate

NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:
                               @[[NSPredicate predicateWithFormat:@"SELF.name CONTAINS[cd] %@", aString], 
                                 [NSPredicate predicateWithFormat:@"SELF.city CONTAINS[cd] %@", aString], 
                                 [NSPredicate predicateWithFormat:@"SELF.state CONTAINS[cd] %@", aString]
                                ]
                         ];

しかし

«2 つ以上 — for を使用» Edsger W. Dijkstra
«または列挙型» vikingosegundo

NSString *aString =@"Ney York";
NSMutableArray *predicates = [@[] mutableCopy];
[@[@"name", @"city", @"state"] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSString *format = [NSString stringWithFormat:@"SELF.%@ CONTAINS[cd] %%@", obj];
    [predicates addObject:[NSPredicate predicateWithFormat:format, aString]];
}];

NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicates];
于 2015-03-05T19:03:40.913 に答える