Как преобразовать данные NSString объекта NSMutableArray в нижний регистр в iOS? - PullRequest
3 голосов
/ 31 марта 2012

Я работаю с базой данных sqlite. Я извлекаю текстовые данные из базы данных sqlite в NSMutableArray с именем myArray. В этой переменной myArray есть столбец с именем «info» с текстовыми данными. После того, как я получаю эти данные в NSMutableArray, я хотел бы преобразовать все текстовые данные из базы данных sqlite в нижний регистр. Я написал следующий код в событии textDidChange searchBar, как это.

NSInteger counter = 0;
    for(NSString *nameMe in myArray)
    {
        NSRange r = [[nameMe lowercaseString] rangeOfString:[searchText lowercaseString]];

        if(r.location != NSNotFound)
        {
            if(r.location== 0)
            {
                [tableData addObject:nameMe];
            }
        }

        counter++;
    }

Однако в нижнем регистре есть ошибка.

Эта ошибка

2012-03-31 16:28:18.217 SqliteTest[1812:f803] -[MyInfoClass lowercaseString]: unrecognized selector sent to instance 0x6da9210
2012-03-31 16:28:18.276 SqliteTest[1812:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MyInfoClass lowercaseString]: unrecognized selector sent to instance 0x6da9210'

Я думаю, что компилятор не знает, как преобразовать данные объекта в нижний регистр. Как я могу решить это? Могу ли я преобразовать данные объекта (NSString) в нижний регистр. Если это возможно, пожалуйста, дайте мне знать, как это сделать. Спасибо за вашу помощь.

1 Ответ

18 голосов
/ 31 марта 2012

Я думаю, что компилятор не знает, как преобразовать данные объекта в нижний регистр.

Проблема в том, что объекты типа MyInfoClass не имеют метода -lowercaseString. Вы перебираете массив, предполагая, что каждый объект в массиве - это NSString, но это, очевидно, не соответствует действительности - в myArray определенно есть хотя бы один экземпляр MyInfoClass. Итак, один из способов решения этой проблемы - убедиться, что вы добавляете в массив только строки.

Вот более короткий и безопасный способ сделать то, что вы делаете выше:

NSArray *lowercaseArray = [myArray valueForKey:@"lowercaseString"];

NSArray -valueForKey: отправит сообщение -valueForKey: с ключом, который вы предоставите каждому объекту в массиве, и соберет результаты в массив. Еще лучше, если какой-либо объект в массиве возвращает nil, результирующий массив будет содержать объект NSNull с этим индексом. Вы захотите проверить эти NSNull при использовании массива, но не получите исключения, как в своем коде.

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

  • Используйте метод NSString -caseInsensitiveCompare: для сравнения строк, если вы делаете сравнение самостоятельно.

  • Если вы используете предикат для поиска совпадения, используйте операторы сравнения строк (LIKE, CONTAINS и т. Д.) С параметром без учета регистра: @ "SELF like [c]% @". Вам также может потребоваться опция без учета диакритики: @ "SELF like [cd]% @".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...