По сути, я хочу сделать следующее:
NSArray *objectsAtIndex1 = @[[@[@"Foo", @"Bar"] objectAtIndex:1]];
но вместо этого используется NSPredicate, поэтому он будет выглядеть примерно так (однако это не работает):
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF[1] != null"]
NSArray *objectsAtIndex1 = [@[@"Foo", @"Bar"] filteredArrayUsingPredicate:predicate]
И, конечно же, @ "Фу" и @"Бар" на самом деле являются неизвестными значениями (и даже могут быть словарями или числами). Возможно ли этого добиться?
зачем вам предикат, в то время как objectAtIndex: может сделать эту работу за вас? есть ли какое-то особое преимущество, которое вы ожидаете от предикат в этом случае?
@holex Причина, по которой в моем случае нужен NSPredicate, заключается в том, что код должен уметь обрабатывать все виды фильтрации, а не только фильтрацию по индексу. Так что было бы неплохо не переписывать сотни строк кода или около того только из-за этого единственного случая.
Вы не можете выполнить «SELF [1]! = Null». SELF - это «Foo» или «Bar», а не массив. Элемент массива не может быть nil. Так что нет, вы не можете использовать NSPredicate, который выполняет evaluateWithObject: для каждого элемента массива. Если вам нужна всевозможная фильтрация, используйте indexesOfObjectsPassingTest:.
Создайте расширение NSArray: -(NSArray *)arrayFromIndex:(NSInteger)index { if ([self count] > index) { return @[self[index]]; } else { return nil; //or return @[]} } кажется более простым способом сделать это. Тогда это NSArray *objectsAtIndex1 = [ @[@"Foo", @"Bar"] arrayFromIndex:1];?
@Larme Спасибо за предложение, но меня не очень беспокоит выход за пределы массива, в моем случае этого не произойдет, поскольку массив используется для заполнения UITableView, а индекс - indexPath.row.





Я решил это с помощью метода predicateWithBlock: на NSPredicate вот так:
NSArray *fooBarArray = @[@"Foo", @"Bar"];
NSUInteger index = 1;
NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
return [fooBarArray indexOfObject:evaluatedObject] == index;
}];
NSArray *objectsAtIndex1 = [fooBarArray filteredArrayUsingPredicate:predicate];
Однако есть одно предостережение: объекты в массиве fooBar должны быть уникальными, чтобы это работало, что не идеально.
В качестве альтернативы можно получить объект в index один раз и вернуть evaluatedObject == objectAtIndex. Формат предиката: "SELF = %@", objectAtIndex. Это позволяет избежать многих indexOfObject:.
Непонятно, хотите ли вы использовать что-то подобное: gist.github.com/tomohisa/3069721 или действительно нужен
NSPredicate(для запроса?)