Использование @ min, @ max и т. Д. Внутри предиката? - PullRequest
5 голосов
/ 29 июня 2011

Можно ли использовать агрегирующий оператор, такой как @min, внутри предиката?

Кстати, предикат фильтрует массив объектов.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF.score == @min.score"];

Я знаю, что вы можете получить минимальное значение, используя операторы ключ-значение, например:

NSNumber *minScore = [myArray valueForKeyPath:@"@min.score"];

Пока что я получаю только сообщения об объектах, которые не соответствуют значению ключа для "@min".

Спасибо

1 Ответ

13 голосов
/ 29 июня 2011

Причина, по которой вы получаете эту ошибку, заключается в том, что предикат применяется к каждому объекту в myArray, и эти объекты, очевидно, не поддерживают ключевой путь @min.score.NSPredicate поддерживает хотя бы некоторые операторы сбора данных.Вот простой пример, который работает:

NSDictionary *d1 = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:35] forKey:@"score"];
NSDictionary *d2 = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:52] forKey:@"score"];
NSDictionary *d3 = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:13] forKey:@"score"];
NSDictionary *d4 = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:19] forKey:@"score"];
NSArray *array = [NSArray arrayWithObjects:d1, d2, d3, d4, nil];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.score == %@.@min.score", array];
NSLog(@"Min dictionaries: %@", [array filteredArrayUsingPredicate:predicate]);

Вы можете видеть, что в этом случае путь к ключу @min.score применяется к массиву, что имеет смысл.Выходными данными является массив, содержащий один словарь, содержащий минимальное значение:

Min dictionaries: (
        {
        score = 13;
    }
)
...