如何在iOS中将NSMutableArray对象的NSString数据转换为小写?

Fir*_*ist 3 objective-c ios

我正在使用sqlite数据库.我从sqlite数据库中检索文本数据到名为myArray的NSMutableArray.在该myArray变量中,有一个名为"info"的列,其中包含文本数据.我将该数据检索到NSMutableArray后,我想将sqlite数据库中的所有文本数据转换为小写.我在searchBar的textDidChange事件中编写了以下代码.

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++;
    }
Run Code Online (Sandbox Code Playgroud)

但是,lowercaseString中发生错误.

这个错误是

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'
Run Code Online (Sandbox Code Playgroud)

我认为编译器不知道如何将对象数据转换为小写.我怎么解决这个问题?我可以将对象(NSString)数据转换为小写.如果可以,请让我知道如何做到这一点.谢谢你的帮助.

Cal*_*leb 18

我认为编译器不知道如何将对象数据转换为小写.

问题是MyInfoClass类型的对象没有方法-lowercaseString.假设数组中的每个对象都是a NSString,你在迭代数组,但这显然不是真的 - 肯定至少有一个MyInfoClass实例myArray.因此,解决问题的一种方法是确保只向数组添加字符串.

这是一个更短,更安全的方式来做你正在做的事情:

NSArray *lowercaseArray = [myArray valueForKey:@"lowercaseString"];
Run Code Online (Sandbox Code Playgroud)

NSArray -valueForKey:-valueForKey:使用您为数组中的每个对象提供的密钥发送一条消息,并将结果收集到一个数组中.更好的是,如果数组中的某个对象返回nil,则生成的数组将在该索引处包含NSNull对象.当你使用数组时,你会想要检查那些NSNull,但你不会像在代码中那样得到异常.

更新:根据OP的评论,似乎将数组转换为小写的原因是可以进行不区分大小写的搜索.值得指出的是,有更好的方法可以实现这一目标.这是两个:

  • -caseInsensitiveCompare:如果您自己进行比较,请使用NSString的方法来比较字符串.

  • 如果您使用谓词来搜索匹配项,请使用字符串比较运算符(LIKE,CONTAINS等)和不区分大小写的选项:@"SELF like [c]%@".您可能还需要变音符号不敏感选项:@"SELF like [cd]%@".