Для изучения (не практично - пока) целей я хотел бы использовать следующий метод в 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;
}];