2014년 11월 3일 월요일

Swift의 String을 Python스럽게 만들어보기

Objective-C의 카테고리 기능은 기존 클래스를 확장하는 용도로 많이 사용된다. Swift에서는 비슷한 기능을 Extension 이라는 기능으로 제공하는데, 이를 잘 활용하면 기본 클래스의 기능을 더욱 확장할 수 있어서 좀 더 편한 코딩이 가능하다.

여기서는 제목을 Python 스럽게 라고 했는데, 이는 파이썬 문자열의 개별 문자 참조와 슬라이싱(Slicing) 기능을 흉내내기 위함이다.

우선 예제 소스코드를 보자.
extension String {
    subscript(index: Int) -> Character {
        let elements = Array(self)
        if index >= 0 { return elements[index] }
        else {
            let revIndex = self.length + index
            return elements[revIndex]
        }
    }

    // substring with range
    subscript(range: Range<Int>) -> String {
        let start = advance(startIndex, range.startIndex, endIndex)
        let end = advance(startIndex, range.endIndex, endIndex)
        return self[start..<end]
    }
}
Swift의 기본 String에 두 가지 기능을 확장하고 있는데 전부 subscript 이다. 이는 대괄호([,])를 이용해 객체 참조 기능을 확장 할 때 쓸 수 있다.

제일 처음의 subscript는 하나의 index를 받아서 Character 를 돌려주는 기능을 하는데, 마치 C의 문자열 배열과 비슷한 거라고 생각하자. 즉, 문자열의 몇 번 째 문자를 얻어오는 기능이다.
let str = "ABCDE"
println(str[0])      // Character("A")
println(str[2])      // Character("C")
println(str[-1])     // Character("E")
마지막에 음수를 인덱스로 넘기는 것은 마치 Python 스러운 부분이다. 실제로 파이썬에서는 문자열의 음수 인덱스를 참조하면 끝에서 부터 계산하는 방식으로 제공하는데 동일한 원리다.

나머지 subscript는 substring, 즉 문자열에서 일부 문자열을 뽑아낼 때 사용할 수 있다. 문법이 조금 다르긴 하지만 파이썬과 비슷하게 사용 할 수 있다.
let fullString = "This is test string"
println(fullString[0...3])       // "This"
println(fullString[0..<3])       // "Thi"
subscript 내부에 Swift의 Range 를 사용하기 때문에 위 처럼 '...' 이나 '..<' 두 가지 오퍼레이터를 이용 할 수 있다.

다만 여기서는 파이썬의 슬라이싱 처럼 음수를 활용하는 방법이 아직 구현되어 있지 않다. 애초에 스위프트의 레인지(Range)는 순차적인 범위만 만들 수 있는 제약 때문이다.

필요하다면 이렇게 substring은 subsciprt를 활용해서 코딩하기 쉽게 만들 수 있다는 예제였다. 개인적으로 라이브러리화 해 놨는데 다른 기능들도 구경 할 수 있다.

https://github.com/seorenn/SRChoco/blob/master/SRChoco/Utilities/StringExtensions.swift

댓글 없음 :