Delegate.md


์ง์—ญํ•˜๋ฉด, '๋Œ€๋ฆฌ์ž', '๋Œ€๋ฆฌ์ธ', '์œ„์ž„ํ•˜๋‹ค' ๋ผ๋Š” ๋œป์ด๋‹ค.

swift์—์„œ๋„ ์ด์™€ ๋น„์Šทํ•œ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์‹ค์ œ ์ฝ”๋“œ๋กœ ๋ณด๋ฉด์„œ ์ดํ•ดํ•ด๋ณด์ž

import UIkit

class ViewController: UIViewController{
    @IBOutlet weak var enteredLabel: UILabel!
    @IBOutlet weak var textField: UITextField!

    @IBAction func buttonClicked(_ sender: Any) {
        enteredLabel.text = textField.text
    }
}

์œ„์˜ ์ฝ”๋“œ๋Š” button์„ ๋ˆ„๋ฅด๊ฒŒ ๋˜๋ฉด textField์— ์ž…๋ ฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ label์— ํ‘œ์‹œ๋˜๊ฒŒ ํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

swift๋ฅผ ์ฒ˜์Œ ๋ง›๋ณด๊ฒŒ ๋  ๋•Œ ๋Œ€๋ถ€๋ถ„ @IBOutlet์œผ๋กœ storyboard์— ์žˆ๋Š” ui์™€ ์†Œํ†ตํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ์ง์ ‘ IBOutlet์œผ๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ ์™ธ์˜ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๊ฐ€ delegate ํŒจํ„ด์ด๋‹ค.

delegate ํŒจํ„ด์—๋Š” ์„ธ ๊ฐ€์ง€ ๊ฐœ๋…์ด ์กด์žฌํ•œ๋‹ค.

  • Receiver: ์ˆ˜์‹ ์ž

  • Delegate: ๋Œ€๋ฆฌ์ž

  • Send (Delegate โ† Receiver)

Delegate๋Š” Reciever๋กœ๋ถ€ํ„ฐ Receiver์ž์‹ ์˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ ๋ฐ›๊ณ , ์ด๋ฅผ ์ด์šฉํ•œ ํ–‰๋™(ex: ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ)์„ ์ทจํ–ˆ์„ ๋•Œ ์ˆ˜์‹ ์ž๋Š” ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

// protocol๋กœ delegate๊ฐ€ ์‚ฌ์šฉํ•  ๋ฉ”์†Œ๋“œ ๋“ฑ๋ก
protocol TapDelegate: class {
    func helloWorld()
}

class Receiver: TapDelegate {
    let button = Delegate()
    
    init() {
        button.delegate = self // delegate์—๊ฒŒ ์ž์‹ ์˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ
    }
    
    func helloWorld() {
        print("Hello World")
    }
}

class Delegate {
    weak var delegate: TapDelegate?
    
    func didTapButton() {
        delegate?.helloWorld() // delegate์— ๋“ฑ๋ก๋œ receiver ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์†Œ๋“œ ์‚ฌ์šฉ
    }
}

์™œ ์‚ฌ์šฉํ•˜๋Š”๊ฐ€?

์ฒซ๋ฒˆ์งธ๋กœ ์†Œ๊ฐœํ–ˆ๋˜ @IBOutlet์˜ ๊ฒฝ์šฐ ์ง์ ‘ UI์˜ ์š”์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ Action์„ ๋งŒ๋“ค์–ด์•ผํ•˜์ง€๋งŒ, delegate๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ์š”์†Œ๊ฐ€ ๋น„์Šทํ•œ Action์„ ์ทจํ•  ๊ฒฝ์šฐ, ๋งŒ๋“ค์–ด๋†“์€ delegate์— ์ž์‹ ์˜ ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•˜์—ฌ delegate์—์„œ ๊ตฌํ˜„๋œ ํ–‰๋™์„ ์ทจํ•˜๋ฉด ๋˜๊ธฐ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง„๋‹ค.

viewcontroller์—์„œ delegate๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ์š”์†Œ์˜ delegate ํ”„๋กœํ† ์ฝœ์„ ์ƒ์† ๋ฐ›์•„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ์•„๋ž˜ ์ฝ”๋“œ ์ฒ˜๋Ÿผ extension์œผ๋กœ ๊ธฐ์กด์˜ ํ”„๋กœํ† ์ฝœ์„ ํ™•์žฅ์‹œ์ผœ ์‚ฌ์šฉํ•œ๋‹ค.

์‹ค์ œ ์ฝ”๋“œ)


import UIKit

class HomeViewController: UIViewController {
    
    /// Receiver
    private let tableView: UITableView = {
        let tableView = UITableView()
        return tableView
    }()
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.addSubview(tableView)
        // ์œ„์—์„œ ์„ ์–ธํ•œ tableView๊ฐ์ฒด๋ฅผ delegate์—๊ฒŒ ๋ณด๋‚ธ๋‹ค.
        tableView.delegate = self
        tableView.dataSource = self
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        tableView.frame = view.bounds
    }

}

/// Delegate
// ์ด๋ ‡๊ฒŒ extension์œผ๋กœ protocol์„ ํ™•์žฅํ•˜๊ณ  ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
extension HomeViewController: UITableViewDelegate, UITableViewDataSource {
    func numberOfSections(in tableView: UITableView) -> Int {
        return 0
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }
}

Last updated