한 마디로 말하면 메뉴얼/설명서
프로토콜 내부에 필요한 부분을 “정의만” 한다 → 함수 이름만 있고 구현 부분은 없이
protocol ChangeLabelDelegate {
func doChange()
}
이런식으로 프로토콜을 단순 나열만 하고 구현 내용은 추훼 프로토콜을 채택하는 곳에서 작성해주게 된다
class SecondViewController: UIViewController, ChangeLabelDelegate {
func doChange() {
previousViewController?.label.text = self.textField.text
}
구조체, 클래스, 열거형 모든 타입에서 가능하며 여러개를 동시에 해도 된다
클래스에서 상속과 채택을 동시에 해주려면 클래스 → 프로토콜 순으로 작성해주어야 한다
위임하다/대리하다는 뜻의 delegate → 무언가를 대신하다는 뜻
객체지향 프로그래밍에서 하나의 객체가 모든 일을 하는 것이 아니라 처리해야 하는 일 중 일부를 다른 객체에게 위임하는 것을 의미
import UIKit
protocol ChangeLabelDelegate {
func doChange(data: String)
}
class SecondViewController: UIViewController{
var delegate : ChangeLabelDelegate?
@IBOutlet weak var textField: UITextField!
@IBAction func buttonDismiss(_ sender: UIButton) {
if let text = textField.text {
delegate?.doChange(data: text)
}
dismiss(animated: true)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
import UIKit
class ViewController: UIViewController, ChangeLabelDelegate {
func doChange(data: String) {
label.text = data
}
@IBOutlet weak var label: UILabel!
@IBAction func goNextVC(_ sender: UIButton) {
guard let nextVC = storyboard?.instantiateViewController(withIdentifier: "secondVC") as? SecondViewController else {return}
nextVC.delegate = self
nextVC.modalPresentationStyle = .fullScreen
present(nextVC, animated: true)
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
위임자들은 일을 시킬 뿐, 일을 어떻게 처리해야 하는지 모른다
일을 처리하는 방법은 그 일을 수행하는 객체에 구현되어 있기 때문!
→ 코드를 재사용하고 유지보수하기 쉬워진다
어떤 일을 해야 하는지를 정해놓기만 하고, 상황에 맞는 코드를 작성하면 된다
예를 들어 우리가 어떤 작업을 처리해야 하는데 동일한 작업인데도 불구하고 객체마다 다른 내용을 처리해야 한다고 생각해보자.