2015년 6월 30일 화요일

Swift 2.0 - CFunctionPointer 대신 클로저 사용하기

Swift 2.0 에서 개선된 사항 중 CFunctionPointer를 클로져로 대체 할 수 있다는 것이 있다. 이건 정말 큰 개선 사항이다. 왜냐하면 난 아직도 이 CFunctionPointer 타입을 다룰 줄 모르기 때문이다. -_-;;

어쨌거나 예제부터. 아래 코드는 콜백(callback)을 사용 할 수 있는 C 함수 예제이다.
int callbackTest(int input, int (*callback)(int inp))
{
    return callback(input);
}
기능 자체는 간단하다. 첫 번째 파라미터의 값을 두 번째 파라미터로 전달된 콜백 함수의 파라미터로 넣어서 이 콜백을 실행시키고 결과를 리턴하는 함수이다. 단순하게 말해 콜백을 대신 실행시켜 주는 쓸모 없는 함수이다 -_-;;;

이 함수를 Swift 에서 호출하려 할 때 두 번째 인자는 'CFunctionPointer<((Int32) -> Int32)>' 타입으로 와야 한다. 이 녀석을 다루려면 COpaquePointer를 넘겨야 하고 이 포인터를 넘기기 위해선 음 블라블라블라... 하여간 귀찮다!

Swift 2.0 에서는 이 함수포인터 대신 클로져(Closure)를 이용 할 수 있다. 아래 코드는 위의 C 로 구현된 함수를 호출하는 Swift 코드 예제이다.
let r1 = callbackTest(10, { inp in
    return inp * 2
})
// r1의 값은 20
        
let r2 = callbackTest(10, { inp in
    return inp / 2
})
// r2의 값은 5
못 쓰다가 쓸 수 있게 된 셈이라 기분이 너무 좋다. =_=;;

이 글은 그냥 Swift 2.0 에서 생긴 변화 중 하나를 짚어보고 넘어가는 글이라 더 자세한 설명은 생략할 수 밖에 없다. 더는 모르겠다. 이히힛~
위 예제는 별도의 C 소스코드 파일(.c 혹은 .m)을 Swift 프로젝트에 추가해서 시험하였다. 이 경우 브릿지 헤더(Bridging Header) 구현을 해야 참조가 가능하다. 이와 관련된 정보는 [Swift 프로젝트에서 Objective-C 코드를 함께 사용하기] 글을 참고하자. 만약 반대의 경우를 원한다면 [Objective-C 프로젝트에서 Swift코드 사용하기] 글을 참고하자.
[관련글] Swift - 클로져(Closure)
[관련글] 스위프트(Swift) 가이드

댓글 없음 :