문자열의 부분집합(Swift)

문자열의 부분집합 구하기

Swift3으로 업데이트 (2016-07-04)

  1. 인덱스타입(Index)은 특정한 집합 내에서의 위치를 가리키기 때문에 다음번 인덱스의 위치를 계산하기 위해서는 원래의 문자집합을 알고 있어야 한다. 따라서 advance() 메소드는 상당히 부담스러우므로, 성능 개선을 위해서 이는 문자열에서 특정 인덱스의 오프셋 이동을 하는 메소드를 사용하도록 바뀌었다. String.index(_:offset:)
  2. Range 타입의 양끝은 startIndex, endIndex가 아닌 lowerBound, upperBound가 되었다.

따라서 서브스크립션 확장은 다음과 같이 재작성 된다.

extension String {
    subscript(r: Range<Int>) -> String {
        let a = self.index(startIndex, offsetBy: r.lowerBound)
        let b = self.index(startIndex, offsetBy: r.upperBound)
        return self[a..<b]
    }
}
~~~~

<!--more-->

<del datetime="2016-07-03T23:57:10+00:00"><blockquote>Swift 2.0 기준으로 업데이트 함. (2015-08-19)</blockquote>
&nbsp;

문자열은 `[1..4]`와 같은 식으로 범위를 이용한 서브 스크립션을 지원하지 않는다. `String.Index` 타입의 범위, 그러니까 `Range` 타입의 범위만 지원한다. (`1..4`는 `Range`이다.)

이걸 함수로 하려면

func substring(from string:String, range:Range) -> String {
let R = advance(string.startIndex, range.startIndex))..<(advance(string.startIndex, range.endIndex)
return string[R]
}




<del datetime="2016-07-03T23:57:10+00:00">혹은 `NSString`은 `substringWithRange(_:)`를 제공하므로 다음과 같이,

let substr = (str as NSString).substringWithRange(NSMakeRange(2, 3))


하는 것도 가능하겠다. 애초에 문자열을 NSString으로 선언하는 방법도 있다.

let nsstr = NSString(string:”123456″)
let substr = nsstr.substringWithRange(NSMakeRange(2, 3))
~~~

Swift3에서 substringWithRange()substring(with:)로 변경되었다. 이 때 range는 NSRange아 아닌 Range<String.Index>를 써야 한다. 또한 다음의 코드도 동작하지 않으니 주의한다.

let s = "hello world"
let b = (s as NSString).substrig(with: NSRange(location:2, length:5))
       //     ^ 'String' is not convertible to 'NSString'