์๋ ํ์ธ์~
์ค๋์ Delegate Pattern์ ๋ํด์ ์ ๋ฆฌํ๋ ค๊ณ ํฉ๋๋ค : )
Swift์ Delegate Pattern์ด๋?
Swift์์ Delegate Pattern์ ๊ฐ์ฒด ๊ฐ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ ๋๋ค.
์ด ํจํด์ ๊ฐ์ฒด ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ์ง ๋ณด์์ฑ์ ๋์ด๊ธฐ ์ํด ์ฌ์ฉ๋ฉ๋๋ค.
Delegate๋ ํ๋กํ ์ฝ๋ก ์ ์๋ฉ๋๋ค. ์ด ํ๋กํ ์ฝ์ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์์ ์ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋๋ก ์๊ตฌํฉ๋๋ค.
์ด๋ ๊ฒ ๊ตฌํ๋ ๋ฉ์๋๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด์๊ฒ ํธ์ถ๋๋ฉฐ
์ด๋ฅผ ํตํด ํด๋น ๊ฐ์ฒด๋ ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด์ ์ํธ์์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค.
์์
๊ฐ๋จํ ์์ ๋ฅผ ํตํด Delegate Pattern์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
1. ํ๋กํ ์ฝ ์ ์ํ๊ธฐ
๋จผ์ , ํ๋กํ ์ฝ์ ์ ์ํฉ๋๋ค.
์๋ ์ฝ๋์์๋ MyViewDelegate๋ผ๋ ํ๋กํ ์ฝ์ ์ ์ํฉ๋๋ค.
์ด ํ๋กํ ์ฝ์ didTapButton()์ด๋ผ๋ ๋ฉ์๋๋ฅผ ์ ์ํ๊ณ ์์ต๋๋ค.
protocol MyViewDelegate: AnyObject {
func didTapButton()
}
2. Delegate ๊ฐ์ฒด ์์ฑํ๊ธฐ
๋ค์์ผ๋ก, ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด๋ ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์๋ ๊ฐ์ฒด๋ฅผ ๋งํฉ๋๋ค.
์๋ ์ฝ๋์์๋ MyViewController ํด๋์ค๋ฅผ ์ ์ํ๊ณ , ์ด ํด๋์ค๋ MyViewDelegate ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์์ต๋๋ค. didTapButton() ๋ฉ์๋๋ฅผ ๊ตฌํํ์ฌ ํด๋น ๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ๋ก๊ทธ๋ฅผ ์ถ๋ ฅํ๋๋ก ํด๋ด ์๋ค.
class MyViewController: UIViewController, MyViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let myView = MyView()
myView.delegate = self
view.addSubview(myView)
myView.snp.makeConstraints { make in
make.edges.equalToSuperview()
}
}
func didTapButton() {
print("Button tapped!")
}
}
myView.delegate = self๊ฐ ์๋ฏธํ๋ ๋ฐ๋ฅผ ์๊ฒ ๋๋ฉด ์ดํดํ๊ธฐ ์ฝ์ต๋๋ค.
์ฌ๊ธฐ์ self๋ MyViewController ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
์ฆ, MyViewController ๊ฐ์ฒด๊ฐ MyView ๊ฐ์ฒด์ ๋ธ๋ฆฌ๊ฒ์ดํธ(๋๋ฆฌ์)๋ก ๋์ํ๋๋ก ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
์์ ์ค๋ช ํ๋ ๊ฒ์ฒ๋ผ ๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด์์, ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด๋ ํ๋กํ ์ฝ์ ์ฑํํ ๊ฐ์ฒด์ ๋๋ค.
MyViewDelegate ํ๋กํ ์ฝ์ ์ฑํํ ๊ฐ์ฒด๋ MyView ๊ฐ์ฒด์ ๋ธ๋ฆฌ๊ฒ์ดํธ๊ฐ ๋ ์ ์๊ฒ ๋๋ ๊ฒ์ด์ฃ .
๋ฐ๋ผ์, MyViewController ๊ฐ์ฒด๊ฐ MyViewDelegate ํ๋กํ ์ฝ์ ์ฑํํ๊ณ ์์ผ๋ฏ๋ก, MyViewController ๊ฐ์ฒด๊ฐ MyView ๊ฐ์ฒด์ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ก ๋์ํ ์ ์๋ ๊ฒ์ ๋๋ค.
์ ๋ฆฌํ๋ฉด myView.delegate = self ์ฝ๋๋ MyView ๊ฐ์ฒด์ delegate ํ๋กํผํฐ์ MyViewController ๊ฐ์ฒด(self)๋ฅผ ํ ๋นํ๋ ์ญํ ์ ํฉ๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ, MyView ๊ฐ์ฒด์์ ๋ฒํผ์ ํญํ ๋๋ง๋ค, MyViewController ๊ฐ์ฒด์ didTapButton() ๋ฉ์๋๊ฐ ํธ์ถ๋์ด, MyViewController ๊ฐ์ฒด์์ ์ถ๊ฐ์ ์ธ ์์ ์ ์ํํ ์ ์๋๋ก ํฉ๋๋ค.
3. ๋ทฐ ๊ฐ์ฒด ์์ฑํ๊ธฐ
๋ง์ง๋ง์ผ๋ก, MyView ํด๋์ค๋ฅผ ์ ์ํฉ๋๋ค.
์ด ํด๋์ค๋ UIButton์ ํฌํจํ๊ณ ์์ผ๋ฉฐ, ๋ฒํผ์ด ํญ๋๋ฉด didTapButton() ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค.
class MyView: UIView {
private let button = UIButton()
weak var delegate: MyViewDelegate?
override init(frame: CGRect) {
super.init(frame: frame)
button.setTitle("๋๋ ๋ฒํผ", for: .normal)
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
addSubview(button)
button.snp.makeConstraints { make in
make.width.equalTo(44)
make.height.equalTo(44)
make.center.equalToSuperView()
}
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func buttonTapped() {
delegate?.didTapButton()
}
}
์ค์ํ ๊ฒ ์๋ค์.
delegate ๊ฐ์ฒด๋ฅผ weak๋ก ์ ์ธํ๋ ์ด์ ์ ๋ํด์ ์์๋ ํ์๊ฐ ์์ต๋๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋ง์๋๋ฆฌ๋ฉด delegate ๊ฐ์ฒด๊ฐ ์๋ฉธ๋ ๋ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํจ์ ๋๋ค.
๋ธ๋ฆฌ๊ฒ์ดํธ ํจํด์์ ๊ฐ์ฒด A๊ฐ ๊ฐ์ฒด B๋ฅผ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ก ์ค์ ํ๋ฉด ๊ฐ์ฒด B๋ ๊ฐ์ฒด A์ ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด๊ฐ ๋ฉ๋๋ค.
์ด๋, ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด๊ฐ ๊ฐ์ฒด A๋ณด๋ค ๋ ์ค๋ ๋จ์์์ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ, ๊ฐ์ฒด A๊ฐ ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด์ ๋ํ ๊ฐํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉด, ๋ธ๋ฆฌ๊ฒ์ดํธ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋์ง ์๊ณ ๊ณ์ ์ด์๋จ๊ฒ ๋ฉ๋๋ค. ์ฆ, ๋ฉ๋ชจ๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
์ ๋ฆฌํด ๋ณด๋ฉด weak๋ก ์ ์ธํ์ฌ ๊ฐํ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง์ง ์๋๋ก ํจ์ผ๋ก์จ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์๊ฒ ๋๋ ๊ฒ์ ๋๋ค.
์ค๋์ ๊ฐ๋จํ๊ฒ ๋ณต์ตํ ๊ฒธ Delegate Pattern์ ๋ํด์ ์ ๋ฆฌํด ๋ดค์ต๋๋ค~
์ฒ์ ์ ํ์ ๋๋ ๋ญ ์๋ฆฌ์ธ๊ฐ ์ถ์ด ์ฌ์ฉ๋ ๋ชปํด๋ดค๋๋ฐ
์ด์ ๋ ํธ์ํ๊ฒ ์ฌ์ฉํ๊ฒ ๋๋ค์ : )
์๋ฌด์ชผ๋ก ๋์์ด ๋๊ธฐ๋ฅผ ๋ฐ๋ผ๊ฒ ์ต๋๋ค.
๊ทธ๋ผ ์ด๋ง ๐๐ป ๐๐ป ๐๐ป
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] Property(ํ๋กํผํฐ)์ ๋ํด์ ์์๋ณด์. (0) | 2023.04.08 |
---|---|
[Swift] Class์ Struct์ ๋ํด์ (0) | 2023.04.07 |
[Swift] Protocol(ํ๋กํ ์ฝ)์ ๋ํด์ (0) | 2023.04.02 |
[Swift] Copy on write(COW)์ ๋ํด์ (0) | 2023.03.30 |
[Swift] ์ปฌ๋ ์ ํ์ (Collection Type)์ ๋ํด์ (0) | 2023.03.26 |