๐ก iOS์์ ์์ฃผ ๋ณด์ด๋ Delegate Pattern ์ด๋ ๋ฌด์์ด๊ณ ์ ํ์ํ๊ฐ?
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์ผ๋ถ๋ฅผ ์์ํ์ฌ ์ผ์ ์ฒ๋ฆฌํ๋ ๋์์ธ ํจํด์ด๋ค.
์ฃผ๋ก ํ๋ ์์ํฌ ๊ฐ์ฒด๊ฐ ์์์ ์์ฒญํ๋ฉฐ, ์ปค์คํ
์ปจํธ๋กค๋ฌ ๊ฐ์ฒด๊ฐ ์์์ ๋ฐ์ ํน์ ์ด๋ฒคํธ์ ๋ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก ์ฐ์ธ๋ค.
์์์ย ์์๊ณผ ๊ฐ์ด ์ฌ์ฌ์ฉ์ ์ํด ๊ฐ๋ ฅํ ๊ตฌ์ฑ์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋๋ค.ย ์์์์๋ย ๋ย ๊ฐ์ ๊ฐ์ฒด๊ฐ ์์ฒญ ์ฒ๋ฆฌ์ ๊ด์ฌํฉ๋๋ค. ์์ ๊ฐ์ฒด๋ ์์ ์ย ๋๋ฆฌ์ธ์๊ฒ ์์ํฉ๋๋ค.ย ์ด๋ ๋ถ๋ชจ ํด๋์ค์ ๋ํ ์์ฒญ์ ์ฐ๊ธฐํ๋ ์๋ธํด๋์ค์ ์ ์ฌํฉ๋๋ค.ย ์์ ์๋ ์์๋ ์์ ์ด ์์ ์๋ฅผ ์ฐธ์กฐํ ์ ์๋๋ก ๋๋ฆฌ์์๊ฒ ์์ ์ ์ ๋ฌํฉ๋๋ค.
๋๋ฆฌ์๋ ์์ ์๋ก๋ถํฐ ์ผ๋ถ ๊ฐ์ฒด๋ฅผ ์ ๋ฌ ๋ฐ์ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ ํ๋์ ์ทจํ๊ณ ์์ ์์๊ฒ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค.
class Receiver {
let button = Delegate()
init() { // Receiver ๊ฐ์ฒด ์์ฑ์
button.delegate = self // delegate์๊ฒ ์๊ธฐ ์์ ์ ์ ๋ฌ
}
func helloWorld() {
print("Hello World")
}
}
class Delegate {
var delegate: Sender?
func didTapButton() {
delegate?.helloWorld() // Receiver์ helloWorld๋ฅผ ์คํํ ์ ์๋ค.
}
}
Receiver๋ ๊ฐ์ฒด ์์ฑ์ ์๊ธฐ ์์ ์ Delegate์๊ฒ ์ ๋ฌํ๊ณ
Delegate๋ ์ ๋ฌ ๋ฐ์ ๊ฐ์ฒด ์ค helloWorld()๋ผ๋ Receiver์ ํจ์๋ฅผ
Receiver๋ฅผ ๊ฑฐ์น์ง ์๊ณ ์๊ธฐ ์์ ์ ํตํด ์คํ ์ํฌ ์ ์๊ฒ๋๋ค.
ํ์ง๋ง ์์ ๊ฒฝ์ฐ,
๋ค๋ฅธ class ๊ฐ์ฒด๊ฐ ๋์ผํ delegate๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์์์ ํ์๋ก ํ๊ฒ๋๋ค.
์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฒญ์ฌ์ง ์ญํ ์ ํ๋ protocol์ ๋จผ์ ๊ตฌํํ์ฌ ์ฌ์ฉํ๋ค.
protocol TapDelegate: class {
func helloWorld()
}
class Receiver: TapDelegate
var delegate: TapDelegate
stack overflow๋ฅผ ๋ ์ดํด๋ดค๋ค.
Property๋ผ๋ ์ฒญ์ฌ์ง์ ํตํด Delegate ํจํด์ ์ด์ฉํ๋ฉด
์ฌ๋ฌ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ๋ฉฐ ๊ตฌ์ฒด์ ์ธ ๊ธฐ๋ฅ์ ๋ํ ์ ์๋ค๋ ์ !
ํด๋์ค ๋จ์๋ก ์์๋๋ ๊ฒ ๋ณด๋ค ๋ฉ์๋ ๊ฐ๋
์ ์์์ด๋ผ๊ณ ์๊ฐํ๋๊น ์ฌ์์ก๋ค.