2014년 6월 15일 일요일

Swift - 확장(Extensions)

Objective-C에는 특정 클래스에 메소드나 읽기전용 프로퍼티를 추가 할 수 있는 카테고리라는 기능이 있다. 개발자가 원하는 기능을 아무 클래스에나 추가 할 수 있는 굉장히 편리하면서도 무서운 기능이다. 스위프트에도 이와 비슷한 기능이 확장(Extensions) 라는 개념으로 제공된다.

익스텐션은 아래와 같은 문법으로 정의 할 수 있다.
extension SomeClassOrStruct {
    ...
}
빈약한 예제 같은데, 이 내부에는 클래스(class)나 구조체(struct)의 프로퍼티나 메소드를 정의하는 것과 동일하게 사용이 가능하기 때문에 생략한 것일 뿐이다. :-)

좀 더 긴 예제를 보자. MyDatetime 이라는 클래스를 하나 정의한다.
class MyDatetime {
    var year = 1
    var month = 1
    var day = 1
    var hour = 0
    var minute = 0
    var second = 0
   
    init(year:Int, month:Int, day:Int, hour:Int, minute:Int, second:Int) {
        self.year = year
        self.month = month
        self.day = day
        self.hour = hour
        self.minute = minute
        self.second = second
    }
}
그저 초기화(init)할 때 프로퍼티를 초기화 해 주는 단순한 기능의 클래스다.

여기서 나는 두 가지 프로퍼티와 하나의 메소드를 이 클래스에 추가해 주고 싶다. 하지만 만약 클래스를 직접 건드리는게 불가능한 상황이라면 익스텐션(Extensions) 기능을 이용하면 된다.
extension MyDatetime {
    var dateString: String {
        return "\(self.year)-\(self.month)-\(self.day)"
    }
   
    var timeString: String {
        return "\(self.hour):\(self.minute):\(self.second)"
    }

    func print() {
        println("\(self.dateString) \(self.timeString)")
    }
}
앞서 이야기한 두 개의 프로퍼티(dateString, timeString)의 getter와 하나의 메소드(print)를 extension을 이용해 정의했다.

결과는 예측 가능하겠지만 아래왁 같다.
var dt = MyDatetime(year: 2002, month: 1, day: 5, hour: 12, minute: 10, second: 59)
dt.print()
// 콘솔에 2002-1-5 12:10:59 가 찍힌다
마치 원래 클래스에 이런게 정의되어 있는 듯 클래스의 기능이 확장되었다.

그나저나 관련 글을 더 쓰고 싶었는데 플레이그라운드에서 위 코드만 돌리면 Xcode가 죽어나간다. 아직 베타이기 때문에 죽어나가는 것을 탓할 수는 없겠지만 그래도 안타까운 일이다.

어쨌거나 확장(extension)에 관한 핵심은 모두 설명했으니 여기서 끝을 낸다.

[관련글] Swift - 구조체(Structure) 훑어보기
[관련글] Swift - 클래스(Class) 훑어보기
[관련글] Swift - 프로퍼티(Properties)
[관련글] Swift - 메소드(Method)

[돌아가기] 스위프트(Swift) 가이드

댓글 없음 :