Nano Hash - криптовалюты, майнинг, программирование

NSCompoundPredicate

Я пытаюсь отфильтровать данные UITableView's, используя UISearchDisplayController и NSCompoundPredicate. У меня есть пользовательская ячейка с 3 UILabels, которые я хочу отфильтровать при поиске, поэтому NSCompoundPredicate.

  // Filter the array using NSPredicate(s)

  NSPredicate *predicateName = [NSPredicate predicateWithFormat:@"SELF.productName contains[c] %@", searchText];
  NSPredicate *predicateManufacturer = [NSPredicate predicateWithFormat:@"SELF.productManufacturer contains[c] %@", searchText];
  NSPredicate *predicateNumber = [NSPredicate predicateWithFormat:@"SELF.numberOfDocuments contains[c] %@",searchText];

  // Add the predicates to the NSArray

  NSArray *subPredicates = [[NSArray alloc] initWithObjects:predicateName, predicateManufacturer, predicateNumber, nil];

  NSCompoundPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];

Однако, когда я это делаю, компилятор предупреждает меня:

Несовместимые типы указателей, инициализирующие «NSCompoundPredicate *_strong» с выражением типа «NSPredicate *»

Каждый пример, который я видел в Интернете, делает одно и то же, поэтому я в замешательстве. Метод NSCompoundPredicate orPredicateWithSubpredicates: принимает (NSArray *) в последнем параметре, поэтому я ДЕЙСТВИТЕЛЬНО запутался.

Что не так?


Ответы:


1

Прежде всего, использование «содержит» очень медленное, возможно, «начинается с»? Во-вторых, что вы хотите:

NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];

В-третьих, вы могли бы просто сделать что-то вроде:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.productName beginswith[cd] %@ OR SELF.productManufacturer contains[cd] %@", searchText, searchText];
30.11.2012
  • Я пытался сделать то же самое раньше, но у меня были сбои - я полагаю, это стоимость работы в течение ~ 15 часов подряд без сна :) 30.11.2012

  • 2

    orPredicateWithSubpredicates: определено для возврата NSPredicate*. Вы должны иметь возможность изменить последнюю строку кода на:

    NSPredicate *compoundPredicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
    

    ... и по-прежнему применяются все составные предикаты.

    30.11.2012

    3

    Вот полезный метод, который я создал на основе ответов выше (за что большое спасибо!)

    Это позволяет динамически создавать NSPredicate, отправляя массив элементов фильтра и строку, представляющую критерии поиска.

    В исходном случае критерии поиска меняются, поэтому это должен быть массив, а не строка. Но в любом случае это может быть полезно

    - (NSPredicate *)dynamicPredicate:(NSArray *)array withSearchCriteria:(NSString *)searchCriteria
    {
        NSArray *subPredicates = [[NSArray alloc] init];
        NSMutableArray *subPredicatesAux = [[NSMutableArray alloc] init];
        NSPredicate *predicate;
    
        for( int i=0; i<array.count; i++ )
        {
            predicate = [NSPredicate predicateWithFormat:searchCriteria, array[i]];
            [subPredicatesAux addObject:predicate];
        }
    
        subPredicates = [subPredicatesAux copy];
    
        return [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];
    }
    
    28.08.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..