predicateWithFormat:
我对 NSPredicate 的方法有一个(对我来说)奇怪的案例。
使用以下内容,我将两个 NSPredicate 实例的描述记录到控制台:
NSNumber *myNumber = [NSNumber numberWithInt:1];
NSString *predicateFormatByHand = [NSString stringWithFormat:@"self MATCHES 'chp%@_img[0-9]+\\.png'", myNumber];
NSPredicate *firstPredicate = [NSPredicate predicateWithFormat:predicateFormatByHand];
NSLog(@"firstPredicate description: %@", firstPredicate);
NSPredicate *secondPredicate = [NSPredicate predicateWithFormat:@"self MATCHES 'chp%@_img[0-9]+\\.png'", myNumber];
NSLog(@"secondPredicate description: %@", secondPredicate);
这输出:
firstPredicate description: SELF MATCHES "chp1_img[0-9]+.png"
secondPredicate description: SELF MATCHES "chp%@_img[0-9]+.png"
我希望这些描述是相同的。
有人可以解释为什么他们不是吗?
(在这个问题之后,我已经为嵌入式单引号使用了各种转义序列,但是这样做时,NSPredicate 一直抱怨它无法解析格式字符串。我很高兴知道发生了什么。)
更新:一个答案表明使用 NSNumber 而不是 int 是一个问题,所以:
NSPredicate *thirdPredicate = [NSPredicate predicateWithFormat:@"self MATCHES 'chp%d_img[0-9]+\\.png'", [myNumber intValue]];
NSLog(@"thirdPredicate description: %@", thirdPredicate);
我最初是从这个开始的,但是输出是一样的:
thirdPredicate description: SELF MATCHES "chp%d_img[0-9]+.png"
(这意味着不评估格式说明符。)