4

predicateWithFormatを使用すると、%@は""で囲まれます。キーには%Kを使用する必要があります。

たとえば[NSPredicate predicateWithFormat @"%@ == %@" ,@"someKey",@"someValue"]

"someKey" == "someValue"

stringWithFormatにいる間、%@は""で囲まれていません

[NSString stringWithFormat @"%@ == %@" ,@"someKey",@"someValue"] 

になりますsomeKey == someValue

なぜ違いがあるのですか?

私は何かが足りないのですか?

stringWithFormatの%@の意味ではないため、predicateWithFormatの「Value」に%@を使用するのはなぜですか。新しい表記を作成してみませんか。たとえば、%Vを使用して「値」を取得し、%@はstringWithFormatの対応するものと同様に値のままにします。

同じ記号、つまり%@の意味が異なるとAppleが判断する理由。

彼らは本当に違いますよね?私は何かが足りないのですか?

4

2 に答える 2

11

文字列変数は述語で引用符で囲まれていますが、動的プロパティ(したがってキーパス)は引用符で囲まれていません。この例を考えてみましょう。

たくさんの人がいるとしましょう。

NSArray *people = @[
    @{ @"name": @"George", @"age": @10 }, 
    @{ @"name": @"Tom", @"age": @15 }
    ];

ここで、名前ですべての人を検索するために配列をフィルター処理する場合、次のような述語に展開されると予想されます。

name like[c] "George"

つまり、これnameは動的キーでGeorgeあり、定数文字列であると言えます。したがって、@"%@ like[c] %@"拡張述語のような形式を使用した場合、次のようになります。

"name" like[c] "George"

これは明らかに私たちが望んでいるものではありません(ここでは両方ともname定数George文字列です)

したがって、述語を作成する正しい方法は次のようになります。

NSPredicate *p = [NSPredicate predicateWithFormat:@"%K like[c] %@", @"name", @"George"];

これが理にかなっていることを願っています。述語の詳細については、こちらのAppleのドキュメントをご覧ください。

于 2013-01-07T09:02:54.773 に答える
1

NSPredicateは文字列を評価する関数です。この例を見る と、NSString stringWithFormatは、対応する場所(%@)に指定された値のみをコピーします。使用法はまったく異なり、NSPredicateを使用して多くの複雑な操作を実行できます。

于 2013-01-07T08:47:44.683 に答える