Как мне указать объект / предикат блока, требуемый NSDictionary keysOfEntriesPassingTest? - PullRequest
4 голосов
/ 14 июня 2010

Для изучения (не практично - пока) целей я хотел бы использовать следующий метод в NSDictionary, чтобы вернуть мне набор ключей, которые имеют значения, используя определенный мной тест. К сожалению, не знаю, как указать предикат.

NSDictionary keysOfEntriesPassingTest:
- (NSSet *)keysOfEntriesPassingTest:(BOOL (^)(id key, id obj, BOOL *stop))predicate

Скажем, например, все мои значения являются NSURL, и я хотел бы получить обратно все URL-адреса, которые находятся на порте 8080. Вот мой пример кодирования, хотя для меня это не имеет никакого смысла. было бы правильно:

NSSet * mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
                 if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
                     return key;
                 }]

И это потому, что я получаю следующую ошибку компилятора:

несовместимые типы указателей блоков, инициализирующие 'void (^) (struct objc_object *, struct objc_object *, BOOL *)', ожидаемые 'BOOL (^) (struct objc_object *, struct objc_object *, BOOL *)'

Чего мне не хватает? Я был бы признателен за указатель на некоторые документы, которые более подробно рассказывают о «блочном объекте», которым должен быть предикат .
Спасибо!


И это код, который работает:

NSSet *mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop)
{
  if ([[obj port] isEqual:[NSNumber numberWithInt: 8080]])
     return YES;
   else
     return NO;
}];

Ответы [ 2 ]

7 голосов
/ 14 июня 2010

Небольшое расширение ответа Барри ....

Блок подобен указателю на функцию с одним ключевым отличием.Блок выведет тип возврата из операторов возврата, содержащихся в или , и выдаст сообщение об ошибке, подобное тому, которое вы сказали (ошибка компилятора LLVM должна быть более разумной).Когда вы написали:

NSSet * mySet = [myDict keysOfEntriesPassingTest:^(id key, id obj, BOOL *stop) {
                 if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
                     return key;
                 }]

Рассмотрите это как функцию:

BOOL bob(id key, id obj) {
    if( [[obj port] isEqual: [NSNumber numberWithInt: 8080]]) {
        return key;
    }
}

Видите проблему?Есть путь к коду, который не возвращает значение, и поэтому компилятор будет жаловаться.

3 голосов
/ 14 июня 2010

Ошибка указывает, что ваш блок должен возвращать BOOL, а не id.Проверьте документы.Я подозреваю, что вы должны вернуть YES, если пара ключ / obj пройдет желаемый тест.

...