NSScanner角色的好处是什么?

时间:2014-09-28 19:46:21

标签: cocoa nsscanner

我有字符串@" ILL WILL KILLS ",我正在使用NSScanner的scanUpToString:intoString:来查找每次出现的“ILL”。如果它准确,它将NSLog 4,9和14。

我的字符串以4个空格开头,我意识到它们是NSScanner的默认charactersToBeSkipped NSCharacterSet的成员。如果我将charactersToBeSkipped设置为nil,如下例所示,则此代码会准确找到3次出现的“ILL”。

NSScanner* scanner = [NSScanner scannerWithString:@"    ILL WILL KILLS    "] ;
scanner.charactersToBeSkipped = nil ;
NSString* scannedCharacters ;
while ( TRUE ) {
    BOOL didScanUnignoredCharacters = [scanner scanUpToString:@"ILL" intoString:&scannedCharacters] ;
    if ( scanner.isAtEnd ) {
        break ;
    }
    NSLog(@"Found match at index:  %tu", scanner.scanLocation) ;
    // Since stopString "ILL" is 3 characters long, advance scanLocation by 3 to find the next "ILL".
    scanner.scanLocation += 3 ;
}

但是,如果我没有取消默认的charactersToBeSkipped,那么会发生以下情况:

  • scanner初始化为scanLocation == 0
  • scanUpToString第一次执行,它“看过去”4个空格并在索引4处“看到”ILL,因此它会立即停止。 scanLocation仍为0
  • 我相信我找到了匹配项,并将scanLocation增加了3。
  • scanUpToString第二次执行,它“看起来超过”1个空格并在索引4处“看到”ILL,因此它会立即停止。 scanLocation仍为3

对我来说,这是scanner第一次在scanLocation == 0停止的设计缺陷,因为我预计它会停留在scanLocation == 4。如果您认为上述代码可以准确NSLog 4,9和14而不设置charactersToBeSkippednil,那么,请告诉我如何。目前,我认为charactersToBeSkipped仅仅是为了使NSScanner更难以使用。

1 个答案:

答案 0 :(得分:0)

  

目前,我认为charactersToBeSkipped仅仅是为了让NSScanner更难以使用。

然后你不是很有想象力。 charactersToBeSkipped的“好处”是......等待它......跳过字符。例如,如果您有一个类似@" 8 9 10 "的字符串,则可以使用-scanInt:三次扫描这三个整数。您不必关心分隔它们的精确空白量。

根据您描述的任务,您只是在字符串中查找字符串的实例,NSScanner可能不是正确的工具。您可能想要使用-[NSString rangeOfString:options:range:]

-scanUpToString:intoString:的文档相当清楚。如果stopString是接收者中的第一个字符串(考虑到将跳过charactersToBeSkipped),则该方法返回NO,这意味着它不会扫描任何内容。因此,扫描位置不会改变。

返回值表示成功或失败。如果停止字符串是下一个(忽略要跳过的字符),则没有任何内容可以扫描“直到”停止字符串;扫描仪已经处于停止字符串,因此方法失败。