4

私は配列を持っています、それは印刷されると次のようになります:

((
        ((
        databaseVersion、
        13
    )、
        ((
        lockedSetId、
        100
    )。
)。

を使用してこれをフィルタリングすることは可能でしょうかNSPredicate(配列内のインデックスによって可能性があります)。つまり、次のようになります。要素0が「databaseVersion」であるすべての行を教えてください。辞書の配列があれば、ここにあるような述語でこれを行うことができることは知っていますが、辞書を使用して大量のデータを格納すると、メモリ消費量が増加することがわかりました(〜80mbから〜120mb )、可能であれば配列を保持します。これがどのように行われるかについての提案はありますか?

4

2 に答える 2

7

これは、述語で「SELF[index]」を使用して実行できます。

NSArray *array = @[
    @[@"databaseVersion", @13],
    @[@"lockedSetId", @100],
    @[@"databaseVersion", @55],
    @[@"foo", @"bar"]
];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF[0] == %@", @"databaseVersion"];
NSArray *filtered = [array filteredArrayUsingPredicate:pred];
NSLog(@"%@", filtered);

出力:

(
        (
        databaseVersion,
        13
    ),
        (
        databaseVersion,
        55
    )
)

または、ブロックベースの述語を使用できます。

NSPredicate *pred = [NSPredicate predicateWithBlock:^BOOL(NSArray *elem, NSDictionary *bindings) {
    return [elem[0] isEqualTo:@"databaseVersion"];
}];
于 2012-12-07T17:26:31.510 に答える
6

単純に、NSPredicateでANYを使用できます。

それはうまくいきます

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF == %@", @"value"];

また

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF contains[cd] %@", @"value"];
于 2015-11-18T11:39:29.337 に答える