따라서 Obj-c에서는 동적으로 메서드를 동작시키려 할 때 Selector를 사용했었습니다.
Obj-c에서와는 달리 swift에서는 별도의 객체를 사용하지 않아도 메서드를 동적으로 동작시킬 수 있습니다.
그러나 아직까지도 많은 iOS의 API 문서들이 Obj-c 기반으로 동작하고 있기 때문에 이 문서들에서 Selector 타입을 요구하는 경우 이를 대체할 수 있는 타입을 Selector에서 제공할 수 있어야 합니다.
이런 필요성 때문에 Swift에서 Selector가 등장하게 되었습니다.
let selector = #selector(someFunction)
Swift는 컴파일 시점에서 메서드를 바인딩(함수를 호출할 때 그 함수가 위치한 메모리 주소로 연결해주는 것)하는 것과 달리 Obj-c는 런타임에 메서드를 바인딩합니다. 따라서 @objc
를 붙임으로써 Swift에게 Obj-c에 의존적인 메서드를 사용할 때는 해당 메서드가 동적 바인딩과 유사한 방식으로 컴파일 되어야 함을 컴파일러에게 알려주어야 합니다. 이 어노테이션 표시가 있으면 Swift로 작성된 코드라 할 지라도 Obj-c 런타임에서도 사용할 수 있게 됩니다.
그러나 obj-c 시절부터 존재했던 프레임워크에 속하는 함수라면 @objc
가 붙지 않아도 objc와 상호호환 가능합니다. UIKit에 속하는 대부분에 프레임워크들이 이 경우에 해당합니다.