Я думаю, что компилятор не знает, как преобразовать данные объекта в нижний регистр.
Проблема в том, что объекты типа 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]% @".