Closed Glsme closed 1 year ago
//๊ฐ์ ๋ณด๋ผ SearchViewController
final class SearchViewController: BaseViewController {
lazy var delegate: SendStockDelegate?
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let stockNameData = stockList[indexPath.row].stockName
delegate?.sendStockName(stockNameData)
self.dismiss(animated: true)
}
//๊ฐ์ ๋ฐ์ BuyandSellViewController
public protocol SendStockDelegate: AnyObject {
func sendStockName(_ text: String)
}
final class BuyandSellViewController: BaseViewController, SendStockDelegate {
func sendStockName(_ text: String) {
mainView.contentSearchBar.text = text
}
}
ํ๋กํ ์ฝ์ ์ ์ํ์ฌ ๊ตฌํํจ์ผ๋ก์จ ์์์ด ๋ ์ฑ ์์ ์บก์ํํ๋ฉฐ, ์ค์ํ ์ ํ(Delegate=๋๋ฆฌ์)์ด ์์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ก ๋ณด์ฅํ๋ค. Delegation์ ํน์ ์ก์ ์ ๋ฐ์ํ๋๋ก ํ๊ฑฐ๋, ์์ค์ ๊ธฐ๋ณธํ์ ์ ์์ง ๋ชป ํด๋ ์ธ๋ถ์ ์๋ ์์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ๋ฑ์ ์ฌ์ฉ๋๋ค.
Delegate ํจํด์ ํต์ฌ์ ์ธ ๋ชฉํ๋ ๊ฐ์ฒด๊ฐ ๋ถ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ๊ฐ์ฒด ์์ ์์ ํต์ ํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค. ๊ฐ์ฒด๊ฐ ์์ ์์ ๊ตฌ์ฒด์ ์ธ ์ ํ์ ์์ง ์๋๋ก ํจ์ผ๋ก์จ, ๊ฐ๋ฐ์๊ฐ ์ฌ์ฌ์ฉ ๋ฐ ์ ์ง๋ณด์๊ฐ ๋ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๊ฒ ํ๋ค.
// ์ด ํ๋กํ ์ฝ์ ๊ณ ์์ด๊ฐ ์ง์ฌ์๊ฒ ์ง์ํ ๋ชจ๋ ๊ฒ์ ๊ฐ์ง๊ณ ์์
protocol CatDelegate {
func feedCat(for cat: Cat, food: CatFood) -> CatFood
func howMuchTimeWePlayed(for cat: Cat, toy: Toy) -> Int
func isSandPreferable() -> Bool
}
class Cat {
// ๊ณ ์์ด๋ ์ง์ฌ๊ฐ ๋ฌด์จ ํด๋์ค์ด๋ ์๊ด์์
// ๋จ์ง ์ง์ฌ๊ฐ ๊ณ ์์ด๋ฅผ ์ํด ํด์ผ๋๋ ์ผ์ ํ ์ ์์ด์ผํจ.
weak var jipsa: CatDelegate?
// ์ง์ฌ๊ฐ ์ผ์ ํ๋ ํ์ผ๊ณผ whenever the manager needs those tasks done, they just have the assistant do it
func performTasks {
switch today {
case .weekday:
catFood = jipsa.feedCat(for: self, catFood: Tuna)
playTime = jipsa.howMuchTimeWePlayed(for: self, toy: KashaKasha)
case .weekend:
isSandPreferable = jipsa.isSandPreferable()
}
}
// ์ง์ฌ๋ ํ๋กํ ์ฝ์ ์ฑํํด์ผํ๋ค. ํ๋กํ ์ฝ์ ์๊ตฌ์ฌํญ์ ๋ชจ๋ ๋ง์กฑํด์ผ ์ปดํ์ผ์ด ๋๋ค.
class Jipsa: CatDelegate {
func feedCat(for cat: Cat, food: CatFood) -> CatFood {
// ๊ณ ์์ด์๊ฒ ๋ฐฅ์ ์ฃผ๋ ์ฝ๋
return food
}
func howMuchTimeWePlayed(for cat: Cat, toy: Toy) -> Int {
// ๊ณ ์์ด์ ์ฅ๋๊ฐ์ผ๋ก ๋์์ฃผ๊ธฐ
return time
}
func isSandPreferable() -> Bool {
// ๊ณ ์์ด ๋ชจ๋ ์ ํธ๋ ๋ถ์ํ๊ธฐ
return true
}
}
๋์์ธ ํจํด์ผ๋ก ํด๋์ค๋ ๊ตฌ์กฐ์ฒด์ ์ฑ ์ ์ค ์ผ๋ถ๋ถ์ ๋ค๋ฅธ ํ์ ์ ์ธ์คํด์ค์๊ฒ ์ ๋ฌ(์์)ํ๋ ์ญํ ์ ํ๋ ๊ฒ์ ๋๋ค.
์์์๋ฅผ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์์ ์ ์ผ์ ์์ํ๋ ํํ์ ๋์์ธ ํจํด์ด๋ค.
Delegate Pattern์ ์ฌ์ฉํ๋ฉด ๋๊ฐ์ ํด๋์ค๊ฐ ์๋ก ์ฐธ์กฐํ๋ ์ํฉ์ด ํ์ฐ์ ์ผ๋ก ๋ฐ์ํ๋ค.
์ด ๋ ์ผ์ ์ ๋ฌ๋ฐ์ ViewController์์ Delegate๋ฅผ ์ฒ๋ฆฌ ํ ์ผ์ ์ ๋ฌํ๋ ViewController๋ ์ด๋ฏธ deinit์ด ๋์๊ธฐ ๋๋ฌธ์ ์ผ์ ์ ๋ฌ๋ฐ์ ์
์ฅ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์์ ์ผ๋ก ํด์ ํ๋ ค๋ฉด weak
ํค์๋๋ฅผ ๋ถ์ฌ MemoryLeak์ด ๋ฐ์ํ์ง ์๋๋ก ํด์ฃผ์ด์ผํ๋ค.
์์์(Delegate)๋ฅผ ๊ฐ๊ณ ์๋ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์๊ฒ ์์ ์ ์ผ์ย ์์ํ๋ ํํ์ ๋์์ธ ํจํด
๊ฐ์ฒด๋ผ๋ฆฌ ์ฐ๊ฒฐํ๋ฉด์ ๊ฐํ ์ฐธ์กฐ ์ํ์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ weak ํค์๋๋ฅผ ์ฌ์ฉํด ๋ฉ๋ชจ๋ฆฌ ๋ฆญ์ ๋ฐฉ์งํด์ผํ๋ค.
๐๏ธ ๋ง๊ฐ์ผ
2023.01.22
๐ ์ฐธ์ฌ์
โ ๏ธ ๋ง์ง๋ง์ผ๋ก ๋ต๋ณ ๋จ ์ฌ๋์ด ์ด์ close ํ๊ณ ๋ฆฌ๋๋ฏธ์ ํญ๋ชฉ ์ ๋ฐ์ดํธ ํด์ฃผ์ธ์.