0

「name」というプロパティの最初の文字で通関オブジェクトの配列をフィルタリングしようとしています。これを達成するために、最初の文字の配列を作成しました。

_lettersArray = [NSArray arrayWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", @"H", @"I", @"J", @"K", @"L", @"M", @"N", @"O", @"P", @"Q", @"R", @"S", @"T", @"U", @"V", @"W", @"X", @"Y", @"Z", nil];

キーが最初の文字であり、オブジェクトがプロパティ名の最初の文字をキーとするオブジェクトの配列である NSDictionary に結果を保存したい:

    for (NSString* letter in _lettersArray) {
    NSPredicate* letterPredicate = [NSPredicate predicateWithFormat:@"name beginswith[c] '%@'", letter];
    NSArray* itemsLetter = [_items filteredArrayUsingPredicate:letterPredicate];

    [_letters setObject:itemsLetter forKey:letter];
}

しかし、このアルゴリズムが終了すると、_letters ディクショナリにはすべてのキーが含まれますが、オブジェクトは空の配列になります。私は変更しようとしました

NSPredicate* letterPredicate = [NSPredicate predicateWithFormat:@"name beginswith[c] '%@'", letter];

為に

NSPredicate* letterPredicate = [NSPredicate predicateWithFormat:@"name beginswith[c] 'B'"];

そして、すべて正常に動作します (もちろん、B で始まるオブジェクトのみが表示されます)。私が間違っていることは何ですか?私にとって、問題が述語命令にあることは明らかです。私は _lettersArray が問題ないことを確認しましたが[letter characterAtIndex:0]、文字の代わりに使用しようとしましたが、同じ結果が得られました...

述語文の NSLog は、私が手動で行った正確な文形成を提供し、機能します!

4

1 に答える 1

2

述語プログラミングガイドから:

一重引用符または二重引用符で囲まれた変数 (または置換変数文字列) により、%@、%K、または $variable がフォーマット文字列のリテラルとして解釈されるため、置換が防止されます。

'%@' から引用符を外してみてください:

NSPredicate* letterPredicate = [NSPredicate predicateWithFormat:@"name beginswith[c] %@", letter];
于 2012-07-13T14:05:01.530 に答える