2

短い質問があります。私は(NSObjectから継承した)で NSArray満たされています。を持っています( とも見なされます )CarsCar@property NSString *engine@synthesize

次に、次を使用して配列をフィルタリングしますNSPredicate

predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(engine like %@)", searchText]];
newArray = [ArrayWithCars filteredArrayUsingPredicate:predicate];

これはエラーをスローしvalueForUndefinedKeyます。はpredicateWithFormat正しいですか?

ご回答ありがとうございます。

4

4 に答える 4

4

これが機能しない本当の理由は次のとおりです。

を使用して文字列を作成すると、次stringWithFormat:のようになります。

@"engine like searchText"

に渡すとpredicateWithFormat:、比較の左側と右側の両方が引用符で囲まれていない文字列であることがわかります。つまり、それらがkeypathsであるかのように解釈されます。

このコードが実行されると、次のようになります。

id leftValue = [object valueForKey:@"engine"];
id rightValue = [object valueForKey:@"searchText"];
return (leftValue is like rightValue);

スローされる例外は、正しい「searchText」という名前のメソッドがないことを訴えるオブジェクトです。

stringWithFormat:これを、呼び出しを取り、すべてを に直接入れた場合とは対照的ですpredicateWithFormat:

NSPredicate *p = [NSPredicate predicateWithFormat:@"engine like %@", searchText];

predicateWithFormat:賢いです。「あはは、%@置換パターン! これは、引数リストから引数をポップして、ボックスに入れ、そのまま使用できることを意味します」と表示されます。それはまさにそれがしようとしていることです。searchText引数リストからの値をポップし、 でボックスNSExpression化し、解析された式ツリーに直接挿入します。

ここで最も興味深いのは、作成される式が定数値式になることです。これは、リテラル値であることを意味します。キーパスやコレクションなどではありません。リテラル文字列になります。次に、述語が実行されると、次のようになります。

id leftValue = [object valueForKey:@"engine"];
id rightValue = [rightExpression constantValue];
return (leftValue is like rightValue);

それは正しいです。またstringWithFormat:に渡す前に何かを渡してはならない理由でもありますpredicateWithFormat:

于 2011-09-26T16:54:25.580 に答える
3

k、間違いを見つけました。

predicate = [NSPredicate predicateWithFormat:@"engine like *%@*", searchText];

正しく動作します。**がありませんでした。さらに、searchText は大文字にする必要があります。

@Josuhuaこれは実際のコードではなく、私の問題を視覚化するためのものです

于 2010-03-24T11:22:45.170 に答える
2

まず、コードが必要以上に冗長であり、コードが間違っている可能性が常にあります。試す:

predicate = [NSPredicate predicateWithFormat:@"engine like %@", searchText];

次に、「ArrayWithCars」はクラス名のように見えます (慣例により、クラスは大文字で始まります)。それは実際にはクラスですか、それとも不適切な名前のローカル変数ですか (例: "arrayWithCars" または単に "cars")?

第三に、正確なエラーは何ですか? 未定義のキーは何ですか? 他の人に助けを求めるときは、エラーを言い換えないでください。あなたが私たちに見せない限り、私たちはあなたが見ているものを見ることができません.

于 2010-03-24T11:19:13.953 に答える
1

このリンクで試してみてください。NSPredicateのさまざまな使用方法を知っているかもしれません

于 2011-09-26T10:38:18.333 に答える