下面是我用字符串过滤数组的测试。如果我的字符串不包含(')字符,它工作得很好。
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"b'en", @"Adam", @"Melissa", @"arbind", nil];
//NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b'"]; -> it work
NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b''"]; -> it crash
NSArray *beginWithB = [array filteredArrayUsingPredicate:sPredicate];
NSLog(@"beginwithB = %@",beginWithB);
我也尝试将我的字符串更改为'b\''
或'b'''
,但它仍然崩溃。
这是崩溃日志
由于未命名的异常'NSInvalidArgumentException‘终止应用程序,原因:’无法解析格式字符串“自包含‘b’
如何解决这个问题?任何帮助都将不胜感激。
发布于 2016-05-19 02:54:32
请按以下方式筛选结果:
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"b'en", @"Adam", @"Melissa", @"arbind", nil];
NSString *strToBeSearched = @"b'";
//NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b'"]; -> it work
NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",strToBeSearched]; //-> it also work
//OR
NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b\\''"];
NSArray *beginWithB = [array filteredArrayUsingPredicate:sPredicate];
NSLog(@"containB = %@",beginWithB);
发布于 2016-05-19 02:52:32
尝尝这个
NSString *searchword = @"b";
NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@",searchword];
你得到的输出
发布于 2016-05-19 02:57:56
当你尝试反斜杠的时候,你离得很近。这是NSPredicate
用来转义特殊字符的字符。但是,您需要两个反斜杠,而不是一个反斜杠:
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Nick", @"b'en", @"Adam", @"Melissa", @"arbind", nil];
NSPredicate *sPredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] 'b\\''"];
// ^^
NSArray *beginWithB = [array filteredArrayUsingPredicate:sPredicate];
NSLog(@"beginwithB = %@",beginWithB);
你需要两个的原因是目标-C编译器。它处理代码中的所有字符串文字,并替换它遇到的转义序列。如果希望NSPredicate
看到单个反斜杠,则字符串文本需要有两个反斜杠,因为反斜杠本身在Objective字符串文本中被编码为\\
。
https://stackoverflow.com/questions/37320857
复制