Используйте NSPredicate для фильтрации по индексу

По сути, я хочу сделать следующее:

NSArray *objectsAtIndex1 = @[[@[@"Foo", @"Bar"] objectAtIndex:1]];

но вместо этого используется NSPredicate, поэтому он будет выглядеть примерно так (однако это не работает):

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF[1] != null"]
NSArray *objectsAtIndex1 = [@[@"Foo", @"Bar"] filteredArrayUsingPredicate:predicate]

И, конечно же, @ "Фу" и @"Бар" на самом деле являются неизвестными значениями (и даже могут быть словарями или числами). Возможно ли этого добиться?

Непонятно, хотите ли вы использовать что-то подобное: gist.github.com/tomohisa/3069721 или действительно нужен NSPredicate (для запроса?)

Larme 26.10.2018 14:35

зачем вам предикат, в то время как objectAtIndex: может сделать эту работу за вас? есть ли какое-то особое преимущество, которое вы ожидаете от предикат в этом случае?

holex 26.10.2018 15:29

@holex Причина, по которой в моем случае нужен NSPredicate, заключается в том, что код должен уметь обрабатывать все виды фильтрации, а не только фильтрацию по индексу. Так что было бы неплохо не переписывать сотни строк кода или около того только из-за этого единственного случая.

turingtested 26.10.2018 15:48

Вы не можете выполнить «SELF [1]! = Null». SELF - это «Foo» или «Bar», а не массив. Элемент массива не может быть nil. Так что нет, вы не можете использовать NSPredicate, который выполняет evaluateWithObject: для каждого элемента массива. Если вам нужна всевозможная фильтрация, используйте indexesOfObjectsPassingTest:.

Willeke 26.10.2018 15:49

Создайте расширение NSArray: -(NSArray *)arrayFromIndex:(NSInteger)index { if ([self count] > index) { return @[self[index]]; } else { return nil; //or return @[]} } кажется более простым способом сделать это. Тогда это NSArray *objectsAtIndex1 = [ @[@"Foo", @"Bar"] arrayFromIndex:1];?

Larme 27.10.2018 13:03

@Larme Спасибо за предложение, но меня не очень беспокоит выход за пределы массива, в моем случае этого не произойдет, поскольку массив используется для заполнения UITableView, а индекс - indexPath.row.

turingtested 27.10.2018 13:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
143
1

Ответы 1

Я решил это с помощью метода 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:.

Willeke 28.10.2018 13:30

Другие вопросы по теме