본문 바로가기
Swfit/짧은 정리

Selector란?

by GGShin 2025. 4. 3.

Selector란?
UIButton을 누르면 어떤 동작을 수행하게 할 것인지 action을 추가할 때 보면 `#selector`구문을 사용해서 사용될 method를 알려주게 됩니다. 이 selector는 method 이름을 알려주는 방식이고, class나 struct 내부에 정의된 method 이름을 지칭합니다.

왜 selector를 이용해야 할까요? 
Swift와 Obj-c 간의 bridge 역할을 수행해 줍니다. 즉, Objective-C 기반의 코드를 Swift에서 사용하기 위한 방식들 중 하나입니다. 
selector에 들어갈 수 있는 method는 반드시 `@objc`를 앞에 붙여주어야 하는데, 이 attribute를 붙여주어야만 Objective-C runtime에 접근이 가능해지기 때문입니다.

언제 사용할까요?
1. timer, target/action pattern에서 주로 사용합니다.
: `#selector()`를 이용해서 Swift function type을 넘겨주면 됩니다. 그러면 compiler가 해당 method가 존재하는지 체크해줍니다. 예전에는 String type으로 method 이름을 넘겨주는 방식이었다고 하니, 런타임에 에러가 발생했을 확률이 높았을 것 같습니다.

 

2. 아직 한 번도 사용해 본 적은 없지만 getter, setter만 따로 지원하는 selector syntax도 존재합니다.
: `#selector(getter: MyClass.foo)` or `#selector(setter: MyClass.foo)`

사용 예시

 

예시를 보면서 각각의 syntax들이 어떠한 역할을 하고 있는 지 다시 한 번 정리해보겠습니다.

final class ViewController: UIViewController {

    private lazy var btn1: UIButton = {
        let btn = UIButton()
        btn.addTarget(self, action: #selector(btn1Touched(_:)), for: .touchUpInside)
        return btn
    }()

    @objc private func btn1Touched(_ sender: UIButton) {
        print("btn1 touched.")
    }
}

 

1. buttonPressed에 `@objc`attribute를 붙여주었기 때문에 obj-c runtime에서 사용 가능해집니다.
2. `#selector()`로 selector를 만들어 줍니다.
3. addTarget method에 selector를 전달하여 button의 action에 buttonPressed method를 연결해줍니다.

 

 

---

참고 자료:

 https://www.dhiwise.com/post/swift-selector-explained-easy-steps-for-better-coding-in-2024

반응형