2014-09-28 3 views
0

문자열이 @" ILL WILL KILLS "이고 "ILL"이 발생할 때마다 NSScanner의 scanUpToString:intoString:을 사용하고 있습니다. 정확한지 확인하려면 NSLog 4, 9 및 14가됩니다.NSScanner의 문자 ToBeSkipped의 이점은 무엇입니까?

문자열은 NSScanner의 기본값 인 charactersToBeSkipped NSCharacterSet의 구성원 인 4 개의 공백으로 시작됩니다. 아래 예제와 같이 charactersToBeSkippednil으로 설정하면이 코드는 "ILL"이 3 번 발생하는 것을 정확하게 찾습니다. 나는 기본 charactersToBeSkipped을 무효화하지 않는 경우

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 ; 
} 

그러나, 여기 무슨 일이야 :

  • scannerscanLocation == 0 초기화됩니다.
  • scanUpToString이 처음 실행되면 4 개의 빈 공간을 훑어보고 ILL의 인덱스 4에 "보게"되므로 즉시 중지됩니다. scanLocation은 여전히 ​​0입니다.
  • 은 내가 일치하는 항목을 찾을 수 있다고 생각하고, 내가 3
  • scanUpToString 2 시간 동안 실행에 의해 scanLocation을 증가, 그것은 한 빈 공간 "과거를 보인다"인덱스 4에서 ILL "인식", 그래서 즉시 중지합니다. scanLocation은 여전히 ​​3입니다. 나에게

은, 내가 그것을 scanLocation == 4에서 멈출 것으로 예상하기 때문에 scannerscanLocation == 0에서 처음으로 중지 설계 결함입니다. 위의 코드가 NSLog 4, 9 및 14로 정확하게 다시 쓸 수 있다고 생각되는 경우 charactersToBeSkipped에서 nil으로 변경 한 다음 으로 지정하십시오. 지금은 제 생각에 charactersToBeSkipped은 NSScanners를 사용하기가 더 어렵게 만드는 것입니다.

답변

0

지금 제 의견으로는 NSScanner을 (를) 사용하기가 더 어려워서 charactersToBeSkipped이 단독으로 존재합니다.

그럼 당신은별로 상상력이 없습니다. charactersToBeSkipped의 "혜택"은 ... 문자를 건너 뛰는 것입니다. 예를 들어, @" 8 9 10 "과 같은 문자열이있는 경우 -scanInt:을 세 번 사용하여 세 개의 정수를 스캔 할 수 있습니다. 그들을 구분하는 공백의 정확한 양에 대해 신경 쓸 필요는 없습니다.

문자열 내에서 문자열의 인스턴스를 찾고있는 곳에서 NSScanner은 아마도 올바른 도구가 아닙니다. -[NSString rangeOfString:options:range:]을 사용하고 싶을 것입니다.

-scanUpToString:intoString:에 대한 문서는 상당히 명확합니다. stopString이 수신자의 첫 번째 문자열 인 경우 (charactersToBeSkipped은 건너 뜁니다)이 메서드는 NO을 반환합니다. 즉, 아무것도 검색하지 않았 음을 의미합니다. 결과적으로 스캔 위치는 변경되지 않습니다.

반환 값은 성공 또는 실패를 나타냅니다. 정지 문자열이 다음 (건너 뛸 문자 무시)이면 "중지 문자열"을 검사 할 것이 없습니다. 스캐너가 이미 중지 문자열에 있으므로 메서드가 실패합니다.

+0

당신은 'rangeOfString'이 아마도 특정 문자열을 검색 할 때 더 나은 도구 일 것입니다. 나는 이전에'scanInt'를 사용하지 않았지만, 어떻게 디폴트'charactersToBeSkipped'와 잘 동작하는지보고'nil'' charactersToBeSkipped'와는 작동하지 않습니다. –

관련 문제