Swift :: NSScanner 사용예제

NSScanner로 문자열로부터 특정한 값 뽑아내기

  1. 먼저 대상문자열을 NSScanner 객체로 감싼다.
  2. 스캔할 값을 구분하는 어떤 구분자가 있는 경우, 이를 skip하도록 캐릭터셋을 만들어 지정한다.
  3. 루프를 돌면서 스캔을 시작한다.

예를 들어 “123,456,789,100” 이라는 문자열에서 컴마로 구분된 각각의 정수값을 뽑아내고 싶다면?

let source = "123,456,789,100"
let scanner = NSScanner(string:source)
scanner.charactersToBeSkipped = NSCharacterSet(charactersInString:",")

var a:Int = 0
while scanner.scanInteger(&a) {
    println(a)
}

“,”가 건너뛰는 글자로 등록되어 있으므로 다음과 같이 동작하게 된다.

  1. 첫 시도에서 정수 123을 스캔한다. 여기서 커서?는 ,의 앞에 있다.
  2. 두 번째 시도에서 ,를 읽지만 스킵한다, 그 뒤 정수 456을 스캔한다.
  3. 하나의 값을 스캔하였으므로 “,”는 더이상 스킵하지 않는다. 커서는 6의 위치에 있다.
  4. 2~3의 과정을 반복한다.

확인해볼 문제

-scanUpToCharactersFromSet:intoString: 에서 스캔이 끝나면 스캔 위치는 어디인지?

끝나야 하는 문자셋이나 문자열 직전까지 스캔했으며, 해당 문자열에서 계속 읽을 준비를 하게 된다.


let tobesplit = NSCharacterSet(charactersInString:"1") let source = "2341234" var s:NSString? let e = NSScanner(string:source) e.scanUpToCharactersFromSet(tobesplit, intoString:&s) // "1"앞까지 읽음. 스캐너의 위치는 1 바로 앞에 있다. println(s!) // 234 var i = 0 e.scanInteger(&i) println(i) // 1234