1

「color」や「make」などのインスタンス変数を持つ Car クラスがあります。色、メーカー、またはその両方を検索できる NSPredicate が必要です。

NSPredicate*predicate=[NSPredicate predicateWithFormat:@"(color contains[c] %@) AND (make contains[c] %@)", chosenColor,chosenMake];

この述語には、color と make の両方が必要です。ユーザーが色のみを指定した場合、make は「nil」になるため、結果は返されません。インスタンス変数に nil を持つ車はありません。

また、検索は color や make だけでなく、多くの変数に対して行われるため、if/case の状況は望ましくありません。「AND if NOT nil」を検索する可能性を与えるオプションはありますか。どんな助けにも感謝します。

4

2 に答える 2

3

nil 以外の属性のみをテストするために、述語フォーマットを動的に構築できます。詳細はこちら。また、検索で分音符号を区別しないようにすることも検討してください (CONTAINS ステートメントに「d」を追加します)。「シュコダ」を例にとってみましょう。「skoda」でも見つけてもらいたいですね。

于 2012-10-11T17:41:15.430 に答える
2

NSCompoundPredicateこれは、 APIを使用すると非常に簡単です。

NSString *chosenColor = ...;
NSString *chosenMake = ...;

NSMutableArray *subpredicates = [NSMutableArray array];

if (chosenColor != nil) {
  NSPredicate *p = [NSPredicate predicateWithFormat:@"color contains[cd] %@", chosenColor];
  [subpredicates addObject:p];
}

if (chosenMake != nil) {
  NSPredicate *p = [NSPredicate predicateWithFormat:@"make contains[cd] %@", chosenMake];
  [subpredicates addObject:p];
}

NSPredicate *final = nil;
if ([subpredicates count] > 0) {
  final = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates];
}
于 2012-10-11T19:37:16.857 に答える