Это возможно, но окольным путем. Я рекомендую вам рассмотреть возможность использования другого подхода.
Как говорится, вот как вы это сделаете:
NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:
[NSArray arrayWithObjects:@"a", @"b", @"c", nil], @"a",
[NSArray arrayWithObjects:@"b", @"c", @"a", nil], @"b",
[NSArray arrayWithObjects:@"c", @"a", @"b", nil], @"c",
[NSArray arrayWithObjects:@"a", @"b", @"c", nil], @"d",
nil];
NSPredicate *p = [NSPredicate predicateWithFormat:@"%@[SELF][0] == 'a'", d];
NSLog(@"%@", p);
NSArray *keys = [d allKeys];
NSArray *filteredKeys = [keys filteredArrayUsingPredicate:p];
NSLog(@"%@", filteredKeys);
NSDictionary *matchingDictionary = [d dictionaryWithValuesForKeys:filteredKeys];
NSLog(@"%@", matchingDictionary);
Вот что происходит:
У нас есть исходный словарь, d
. Это словарь, в котором буква (a
, b
, c
или d
) связана с массивом. Мы собираемся найти все ключи , которые соответствуют массиву, где первый элемент - a
.
Наш предикат:
[NSPredicate predicateWithFormat:@"%@[SELF][0] == 'a'", d];
Здесь мы используем оператор индексации в нашем исходном словаре. SELF
при оценке этого предиката будет одним из ключей из d
. Так что %@[SELF]
вернет массив. Затем мы берем 0-й элемент этого массива и сравниваем его со строкой a
. Если это соответствует, то это возвращает YES
.
Затем мы берем все ключи в словаре и фильтруем их, используя этот предикат. Это означает, что результирующий массив будет содержать только ключи, где первый элемент соответствующего массива равен a
.
Как только у нас есть соответствующие ключи, мы извлекаем «подсловарь» из нашего исходного словаря, чтобы получить наш окончательный сокращенный словарь.
В приведенном выше тесте matchingDictionary
имеет два ключа (a
и d
), которые оба связаны с массивом, содержащим (a, b, c)
.
Если вы хотите вместо NSArray
, который содержит совпадающие массивы, вы бы использовали -[NSDictionary objectsForKeys:notFoundMarker:]
вместо.
Однако это неудобное решение, и я все еще думаю, что вам следует реорганизовать ваши данные.