iOS/개념

[iOS] addTarget, @objc, #selector

누알라리 2021. 2. 7. 21:09

개요

 

모바일 개발을 하다보면 버튼이 들어가는 뷰 작업을 굉장히 많이 하게 됩니다.

버튼을 눌렀을 때의 event 처리도 당연히 이어지는 작업 입니다.

 

버튼에 대한 event 처리는 크게

1. RxSwift의 subscribe 사용

2.@objc function 생성 후 addTarget으로 연결

이 두 가지 방법을 많이 사용하는데요.

 

RxSwift에 대한 내용은 추후에 하나하나 다뤄보는것으로 하고,

오늘은 주로 간단한 event 처리에 주로 사용하는 (사실 읽기 더 편해서...) 2번 방법에서 사용하는 개념들에 대해 알아보겠습니다.

 

let btnConfirm = UIButton()
self.addSubview(btnConfirm)
btnConfirm.then {
	$0.addTarget(self, action: #selector(btnConfirmPressed(_:)), for: .touchUpInside)
}

@objc func btnConfirmPressed(_ button: UIButton) {
	// 버튼을 눌렀을 때 처리
}

2번 방법, 즉 함수를 이용한 button event 처리는 위 내용이 전부 입니다.

참 쉽죠?

쉬운 방법인데.. @objc, addTarget, #selector 의 정의을 옛날에 슥 보고 지나쳤던 것 같아서 이 글에서 정리하겠습니다.

 


@objc

Swift를 사용한 코드를 Objective-C 코드와 상호작용 시키기 위해 쓰는 키워드 입니다.

Swift를 사용한 코드에서 class나 method에 이 키워드를 붙이면 Objective-C와 Swift 코드에서 사용할 수 있게 됩니다.

Objective-C를 사용하는 곳에서 @objc를 붙이지 않은 function을 호출하면 오류가 발생하게 됩니다.

 

 

#selector

함수를 직접 지정해서 실행할 때 사용되는 함수 선택 지정자(?) 입니다.

본래 Objective-C에서 @selector(methodName)라는 형식으로 사용 되었는데, 런타임에서 선택한 함수가 실행되는 동적 바인딩의 형태 입니다.

이게 Swift로 넘어오면서 #selector() 키워드로 바뀌며 안에 함수를 지정하는 형태가 되었습니다.

#selector() 에 전달할 메소드를 작성할 때는 Objective-C와의 호환성을 위해 반드시 함수에 @objc 키워드를 붙여줘야 합니다.

 

addTarget(_:action:for:)

developer.apple.com/documentation/uikit/uicontrol/1618259-addtarget

 

Apple Developer Documentation

 

developer.apple.com

 

func addTarget(_ target: Any?, action: Selector, for controlEvents: UIControl.Event)

control로 발생하는 이벤트로 target 오브젝트와 action 메서드를 이어주는 함수 입니다.