ํ๋ก์ ํธ ๊ธฐ๊ฐ 2022.02.21 ~ 2022.03.11
ํ์ : @cherrishRed @saafaaari / ๋ฆฌ๋ทฐ์ด : @stevenkim18
๐ง ์ฃผ์ค๋ฅผ ์ฃผ๋ฌธํ์ธ์!
โ๏ธ ํ์ ๋ ์ฃผ์ค๋ ํ์์ ๋๋ค
๐ ํ์ ์ด์ฌ๋ ๊ด์ฐฎ์์ ์ฌ๊ณ ๋ฅผ ์์ ํ์ธ์
์ฃผ์ค ์ฃผ๋ฌธ
- ์ฃผ์ค๊ฐ ์ฌ๊ณ ๊ฐ ์์ด ์ฃผ๋ฌธ์ด ๊ฐ๋ฅํ ๋ ์ฃผ์ค๊ฐ ๋์๋ค๋ ์๋ฆผ ํํ, ์๋ค๋ฉด ์ฌ๋ฃ๊ฐ ์๋ค๋ ์๋ฆผ๊ณผ ์ฌ๊ณ ๋ฅผ ์์ ํ ์ง์ ๋ํ ์ผ๋ฟ ํํ
- ์ฌ๊ณ ๊ฐ ์์ด ์ฃผ๋ฌธ์ด ๊ฐ๋ฅํ ์ฃผ์ค๋ ๋ฒํผ์ด ํ๋์, ์์ด ์ฃผ๋ฌธ์ด ๋ถ๊ฐ๋ฅํ ์ฃผ์ค๋ ๋ฒํผ์ด ํ์์ผ๋ก ํํ
์ฌ๊ณ ์์
- ์ฌ๊ณ ์์ ํ๋ฉด์ผ๋ก ๋์ด๊ฐ ์ํ๋ ๋งํผ ์ฌ๊ณ ์์ ํ "์" ๋ฒํผ์ ๋๋ฅด๋ฉด ์ ์ฉ
- "์๋์" ๋ฒํผ์ ํด๋ฆญ์ ์ฌ๊ณ ๊ฐ ์์ ๋์ง ์๊ณ , ์ฐฝ ์ข ๋ฃ
Modality
Alert
Navigation
Stepper
AutoLayout
delegate
Protocol
CustomStringConvertible
- ์ด๊ธฐ๊ฐ ์ค์ ์ ๊ดํ ์ด์
- ํ์์๋ ๊ฐ VS ์กฐ๊ฑด๋ฌธ ๋ฐ๋ณต๋ฌธ ์ค์ฒฉ
- for ๋ฌธ ์์ guard ์ฌ์ฉ์ ๋ํ ๋ฆฌ๋ทฐ์ด๋์ ์๊ฐ
- ํด๋์ค ๋ด๋ถ์ ์ด๊ฑฐํ ์ ๊ทผ์ ๊ดํด
- ์ด๊ฑฐํ์ ์์น์ ๋ฐ๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ์ฐจ์ด
- MVC์ ๋ํ ๊ฐ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ๋ฒ์
- ์ด๊ฑฐํ ์ฌ์ฉ๋ฒ
- ํด๋์ค์ ๊ตฌ์กฐ์ฒด(์ฐธ์กฐํ์ ๊ณผ, ๊ฐํ์ )์ ์ฐจ์ด
- ๊ฐํ์ ์ ๊ฐ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ๋ฉ๋ชจ๋ฆฌ์ ๋ณํ ๋ฐ mutatingํค์๋
- ํ์ ์ด๊ธฐํ์ ๋ฐฉ๋ฒ๊ณผ ๊ฐ ์ฐจ์ด ๋ฐ ํ๋ฌํผํฐ์ ์ด๊ธฐํ ์์ ์ ๋ํด
- nestType
- ํจ์์ ํ๋ผ๋ฏธํฐ ๋ค์ด๋ฐ์ ๋ํด
- guarad๋ฌธ๊ณผ if๋ฌธ์ ์ฐจ์ด
nestType(enum)
struct JuiceMaker {
enum Juice {
//๊ตฌํ์ฌํญ
}
}
nesteType ํ์ ์ ์ ์ธํ ๊ฒฝ์ฐ JuiceMaker.Juice ์ฒ๋ผ ํ์ ์ผ๋ก ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
nestType์ผ๋ก ์ป๊ฒ ๋๋ ์ฅ์ ์ Juice ๋ผ๋ ํ์ ์ ์ ๊ทผํ ๋ JuiceMaker.Juice ๋ก ์ ๊ทผํ๊ฒ ํ์ฌ Juice๊ฐ JuiceMaker์ ์ฐ๊ด๋ ๊ฐ ์์ ์ ํํ ํ๋๋ฐ์ ์๋ค. ์ ์ญ์ผ๋ก ๋นผ๋ ๋ฌธ์ ์์ง๋ง, ํ์ฌ๋ Juice ์ ํ์ ์ด JuiceMaker ์์์๋ง ์ฌ์ฉ๋๊ณ ์๋ค๋ณด๋ ์ฌ๊ธฐ์์ ์ฌ์ฉ๋๋ ๊ฐ์ด๋ค ๋ผ๋ ์๋ฏธ๋ฅผ ์ฝ๋์ ๋ด๊ณ ์ถ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ดํ ์คํ ์์ ๋ค๋ฅธ ๊ฐ์ฒด์์ Juice ํ์ ์ ์ฌ์ฉํ๋ฉด์ Juice ํ์ ์ ๋ฐ์ผ๋ก ๋นผ๊ธฐ๋ก ๋ ผ์ํ๊ณ , ๊ทธ ์ค JuiceMaker ์์์๋ง ์ฌ์ฉ๋๋ recipe ์ด๋ผ๋ ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ extension ์ผ๋ก JuiceMaker ๋ด๋ถ์ ์ ์ธํด ์ฃผ๊ฒ ๋์๋ค.
์ด๋์ ๋ผ์ด์ ธ
class FruitStore {
private let defaultStock: Int = 10
var stock: [Fruit: Int] = [.strawberry: self.defaultStock,
.banana: self.defaultStock,
.pineapple: self.defaultStock,
.kiwi: self.defaultStock,
.mango: self.defaultStock]
}
//์ปดํ์ผ ์ค๋ฅ: Cannot find 'self' in scope
์ ์ฒ๋ผ ๊ธฐ๋ณธ ํ๋กํผํฐ ์ด๊ธฐํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ ๋ selfํค์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด์ ๋ ์์ ์ ๋ฌธ์ ์ธ๋ฐ ํ์
๋ด๋ถ์์ ๊ธฐ๋ณธ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๊ธฐํํ์ ์ ์ด๊ธฐํ ์์ ์ด defaultStock
์ stock
๊ฐ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์์ ์ ๋ฌ๋ฆฌ ์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผ ํ๋๋ฐ lazy
ํค์๋๋ฅผ ์ด์ฉํ์ฌ ์์ ์ ๋ค๋ฅด๊ฒ ํด์ฃผ๊ฑฐ๋, ์ด๋์
๋ผ์ด์ ธ init()
๋ด๋ถ์์ ํด์ฃผ์ด์ผ ํ๋ค.
class FruitStore {
private(set) var stock: [Fruit: Int]
init(defaultStock: Int = 10) {
stock = [.strawberry: defaultStock,
.banana: defaultStock,
.pineapple: defaultStock,
.kiwi: defaultStock,
.mango: defaultStock]
}
}
๋๋ฌธ์, ์์๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก init์ ์ ๋ฌ์ธ์์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ์ฌ ์ ์ฐํ ์ด๊ธฐํ๋ฅผ ํ ์ ์๋๋ก ์ด๋ฅผ ํด๊ฒฐํ์๋ค. ์ด๋ฅผ ๊ณต๋ถํ๋ฉฐ, ์ฌ๋ฌ ์ด๊ธฐํ ๋ฐฉ๋ฒ์ ์ธ์ ์ด๋ค ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์์ง์
ํ์ ํ๋กํผํฐ๊ฐ ํญ์ ๊ฐ์ ๊ฐ์ ๊ฐ์ง๋ค๋ฉด, ์ด๊ธฐํ ๊ตฌ๋ฌธ ์ฌ์ฉ๋ณด๋ค๋ ๊ธฐ๋ณธ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค. ์ ๋ดํ๋ฉด, ๊ธฐ๋ณธ ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ์์ ๋ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ์ง๊ณ ๋ช ํํด์ง๋ฉฐ, ํ๋กํผํฐ ํ์ ์ ์ ์ถํ๊ธฐ ์ฝ๋ค. ํ์ง๋ง, ์ธ์คํด์ค๋ง๋ค ๋ค๋ฅธ ํ๋กํผํฐ ์ด๊น๊ฐ์ ์ค์ ํด ์ค์ผ ํ๋ ๊ฒฝ์ฐ, ์ด๊น๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ ์ ์๋ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ฌ์ฉ์ด ์ ์ฉํ๋ค.
์ด๊ธฐํ์ ๋จ๊ณ๊ฐ ์๋ค๋ ๊ฒ์ ๋ฐฐ์ธ ์ ์์๋ค.
1๋จ๊ณ
- ์ง์ ๋ ๋๋ ํธ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํด๋์ค์์ ํธ์ถ๋ฉ๋๋ค.
- ํด๋์ค์ ์๋ก์ด ์ธ์คํด์ค์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ ํ ๋น๋ฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ๋ ์์ง ์ด๊ธฐํ ๋์ง ์์์ต๋๋ค.
- ํด๋์ค์ ๋ํ ์ง์ ๋ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ํด๋์ค์ ์ํด ๋์ ๋ ๋ชจ๋ ์ ์ฅ๋ ํ๋กํผํฐ๊ฐ ๊ฐ์ ๊ฐ์ง๊ณ ์๋์ง ํ์ธํฉ๋๋ค. ์ด๋ฌํ ์ ์ฅ๋ ํ๋กํผํฐ์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ ์ด๊ธฐํ ๋ฉ๋๋ค.
- ์ง์ ๋ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์์ฒด ์ ์ฅ๋ ํ๋กํผํฐ์ ๋์ผํ ์์ ์ ์ํํ๊ธฐ ์ํด ์์ ํด๋์ค ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ ๋ฌ๋ฉ๋๋ค.
- ์ด๊ฒ์ ์ต์์ ์ฒด์ธ๊น์ง ํด๋์ค ์์ ์ฒด์ธ ์๋ก ๊ณ์๋ฉ๋๋ค.
- ์ต์์ ์ฒด์ธ์ ๋๋ฌํ๊ณ ์ฒด์ธ์ ๋ง์ง๋ง ํด๋์ค๊ฐ ๋ชจ๋ ์ ์ฅ๋ ํ๋กํผํฐ๊ฐ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํ์ธํ๋ฉด ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ๋ ์๋ฒฝํ๊ฒ ์ด๊ธฐํ ๋์๋ค๊ณ ๊ฐ์ฃผํ๊ณ ์ฒซ๋จ๊ณ๊ฐ ์๋ฃ๋ฉ๋๋ค.
2๋จ๊ณ
- ์ฒด์ธ์ ์ต์์์์ ์๋๋ก ๋ด๋ ค๊ฐ๋ฉด ์ฒด์ธ์ ๊ฐ ์ง์ ๋ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ธ์คํด์ค๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ฉ์ ์ ์ํ ์ ์๋ ์ต์ ์ด ์์ต๋๋ค. ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ด์ self ๋ก ์ ๊ทผํ ์ ์์ผ๋ฉฐ ํ๋กํผํฐ๋ฅผ ์์ ํ ์ ์๊ณ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ํธ์ถํ๋ ๋ฑ์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
- ๋ง์ง๋ง์ผ๋ก ์ฒด์ธ์ ๋ชจ๋ ํธ์ ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉ์ ์ ์ํ๊ณ self ๋ก ์์ ํ ์ ์๋ ์ต์ ์ด ์์ต๋๋ค.
๊ณต์๋ฌธ์๋ฅผ ์ธ์ฉํ์ฌ ์์ฑํ์์ต๋๋ค.
guard if ๋ฌธ ์ฐจ์ด if์ guard๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ์ฝ๋๋ฅผ ์ฝ๋ ํ๋ฆ์ด ๋ฌ๋ผ์ง ์ ์๋ค.
guard checkOneStock(of: juice, with: list) else { return false }
if checkOneStock(of: juice, with: list) == false { return false }
์ ์ ํ ์ํฉ์ ์ ์ ํํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
- ์ด๋ ค ๋ฒํผ์ ๋ํ ์ก์ ์ ํ๋์ IBAction์ผ๋ก ์ฒ๋ฆฌํด์ค ๊ฒ์ธ๊ฐ
- ์ด๋ค ๋ฐฉ์์ผ๋ก ์๋ฌ ์ฒ๋ฆฌ๋ฅผ ํด์ค ๊ฒ์ธ๊ฐ
- ๋ค๋ฅธ ์ํฉ์ ๋ณด์ด๋ ์ผ๋ฟ์ ๋ํ ํจ์๋ฅผ ๋ถ๋ฆฌํ ๊ฒ์ธ๊ฐ? ํตํฉํ ๊ฒ์ธ๊ฐ?
- ํ๋ฉด์ ํ์ ๋ชจ๋ฌ์ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ ๋ด๋น๊ฒ์ด์ ์ ์ฌ์ฉํ ๊ฒ์ธ๊ฐ?
- ๋ชจ๋ฌ๊ณผ ๋ค๋น๊ฒ์ด์ ์ ์ฐจ์ด
- ์ฑ๊ธํค ํจํด
- ์๋ฌ ํธ๋ค๋ง
- CustomStringConvertible
- KVO, Notification center ์ ์ฌ์ฉ๋ฒ
์ฑ๊ธํค ํจํด ์ฑ๊ธํค์ ์ฌ๋ฌ๊ณณ์์ ๊ฐ์ ์ธ์คํด์ค์ ์ ๊ทผํด ๋ชจ๋๊ฐ ๊ฐ์ด ๊ฐ์ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ค.
์ฅ์ ์ ์ด๋์์๋ ์ ๊ทผํ ์ ์๋ ์ ์ญ์ธ์คํด์ค ์ด๊ธฐ ๋๋ฌธ์ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํ๊ณ ํธํ๋ค. ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝํ ์ ์๋ค. ๋จ์ ์ ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น์ ์ด๊ธ๋๋ค. ๊ฐ์ฒด์งํฅ์ ์์น ์ค ๊ฐ๋ฐฉ ํ์ ์์น์ผ๋ก MVC ๊ฐ๊ฐ์ ์ญํ ์ด ์ ๋ถ๋ฆฌ๋์ด์ผ ํ๋๋ฐ, ์ฑ๊ธํค์ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ด ์ ์ ๊ฒฐํฉ๋๊ฐ ์ฌ๋ผ๊ฐ ๊ฐ๊ฐ์ ์ญํ ์ด ๋ชจํธํด ์ง๊ฒ ๋๋ค. ๋ํ ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ๋๊ธฐํ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ ๊ฒฝ์ฐ 2๊ฐ์ ์ธ์คํด์ค๊ฐ ์์ฑ๋๋ ๋ฌธ์ ์ ์ด ๋ํ๋๋ค๊ณ ํ๋ค.
Swift์์๋ ๋ ธํฐํผ์ผ์ด์ ์ผํฐ, NSFileManager, NSWorkspace, UIApplication ๊ทธ๋ฆฌ๊ณ UIAccelerometer ๋ฑ์ด ์ฑ๊ธํค์ผ๋ก ๊ตฌํ๋์ด ์๋ค.
์ฒ์์ ์ฌ๊ณ ๊ด๋ฆฌ์ ์ฑ๊ธํค ํจํด์ ํ์ฉํ์์ง๋ง, swift ์์ ์ฑ๊ธํค์ ์ฌ์ฉํ๋ ์๋์ (์ผ์ ํด์ฃผ๋ ์ญํ ) ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์๋๊ฐ ๋ง์ด ์๋ค๊ณ ํ๋จํด ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์๋ค.
KVO, Notification center ์ฑ๊ธํค ํจํด์์ 1๋ 1๋ก ๊ฐ์ ์ ๋ฌํ๋๋ฐ ํนํ๋์ด ์๋ KVO๋ก ๋ก์ง์ ๋ณ๊ฒฝํ๋ ค ํ์์ผ๋,
class FruitStore: NSObject {
//static var shared = FruitStore()
@objc dynamic var stock: [Fruit: Int]
private init(defaultStock: Int = 10) {
stock = [.strawberry: defaultStock,
.banana: defaultStock,
.pineapple: defaultStock,
.kiwi: defaultStock,
.mango: defaultStock]
}
}
//์ปดํ์ผ ์ค๋ฅ: Property cannot be marked @objc because its type cannot be represented in Objective-C
์์ ๊ฐ์ด, enum ์ด ๋ค์ด์๋ dictionary ํ์ ๊ฐ์ ์ ๋ฌ ํ ์ ์์ด ์ ์ฉํ์ง ๋ชปํ๋ค.(enum ํ์ ์ NSObject๋ฅผ ์์ ๋ฐ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ KVO ๋ฐฉ์์ผ๋ก ์ฎ๊ธธ ์๊ฐ ์๋ค.)
func changeStock(of fruit: Fruit, to numberOfFruit: Int) {
guard var inStock: Int = stock[fruit] else { return }
inStock += numberOfFruit
stock[fruit] = inStock
NotificationCenter.default.post(name: Notification.Name("notificationStock"),
object: nil,
userInfo: ["fruit": fruit,
"stock": inStock]
)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(self, selector: #selector(updateFruitLable(_:)), name: Notification.Name("notificationStock"), object: nil)
}
@objc private func updateFruitLable(_ notification: Notification) {
guard let fruitName = notification.userInfo?["fruit"] as? Fruit else { return }
guard let fruitStock = notification.userInfo?["stock"] as? Int else { return }
print(fruitName, fruitStock)
}
๋๋ฌธ์ ์์ ๊ฐ์ด, 1๋ n ๋ฐฉ์์ด๊ธด ํ์ง๋ง ๊ฐ์ ์ ๋ฌํ ์ ์๋ Notification Center ๋ฅผ ์ฑํํ์ฌ ๊ฐ์ ์ ๋ฌํ์๋ค. ํ์ง๋ง ๋๊ฒจ์ฃผ๋ ๊ฐ์ ์์ ๋นํด ์ฝ๋๊ฐ ๋ณต์กํด์ก๊ณ ์ด๋์์ ๊ฐ์ ๋ณด๋ด๋์ง ์ถ์ ํ๊ธฐ๊ฐ ์ด๋ ต๊ณ ํ๋ณํ์ ํด์ค์ผ ํ๋ ๋จ์ ๋ฑ์ผ๋ก ๊ฒฐ๊ตญ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ๋๊ฒจ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ์๋ค.
๋ค์ํ ํ๋ฉด์ ํ ๋ฐฉ๋ฒ ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ, ํ๋ฉด์ ํ์ ๋ํ ์ด์๊ฐ ๋ฐ์ํ๋ค. ํ๋ฉด ์ ํ์ ๋ฐฉ๋ฒ์ ์คํ ๋ฆฌ๋ณด๋์์ ์ง์ Segue๋ฅผ ์ด์ฉํ์ฌ ์ ํํด์ฃผ๋ ๋ฐฉ๋ฒ ๋๋, ์ฝ๋๋ฅผ ์ด์ฉํ์ฌ Navigation๋ฐฉ์์ผ๋ก Pushํ๋ ๋ฐฉ๋ฒ๊ณผ Modally๋ฐฉ์์ผ๋ก Present ํด์ฃผ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
@IBAction func moveStockCorrectionView(_ sender: UIButton) {
let stockCorrectionView = self.storyboard?.instantiateViewController(withIdentifier: "stockCorrection")
self.present(stockCorrectionView!, animated: true, completion: nil)
}
stockCorrectionView?.modalTransitionStyle = .coverVertical
stockCorrectionView?.modalPresentationStyle = .automatic
ํ๋ก์ ํธ์์ Modally๋ฐฉ์์ผ๋ก Present ํด์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฑํํ์๊ณ , TransitionStyle๊ณผ PresentationStyle์ ๊ธฐ๋ณธ๊ฐ์ธ .coverVertical
.automatic
์ ์ฌ์ฉํ์๋ค.
- ๋ชจ๋ฌ์ ํ์ฉํ ๋ทฐ ์ด๋์์ ์ค๊ฐ ๋ค๋น๊ฒ์ด์ ์ปจํธ๋กค๋ฌ ๋๋ฌธ์, ๋ง๋ ๋ทฐ ์ธ์คํด์ค์ ์ค์ ์ด๋๋ ๋ทฐ์ ์ธ์คํด์ค๊ฐ ๋ฌ๋๋ ๋ฌธ์
- ํ๋ฉด๊ฐ ๋ฐ์ดํฐ ์ด๋์ ๊ดํ ๋ฌธ์
- MVC
- delegate
- protocol
- auto Layout
MVC
์ฒ์ MVC ๋์์ธ ํจํด์ ๋ํด ์๊ฐํด ๋ณด๋ฉฐ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ํ์๋ค.
๋๋ฌธ์ ์ฒซ ๊ณ ๋ฏผ์ "๊ฐ ๊ฐ์ฒด๊ฐ ํน์ฑ๊ณผ ํ์๋ฅผ ์ด๋๊น์ง ๋ ๊ฒ์ด๋?"๋ผ๋ ๊ถ๊ธ์ฆ์์๋ค.
MVC ๋์์ธ ํจํด์ด ์๊ฒจ๋ ํต์ฌ์ ์ ์ง ๋ณด์๋ผ๊ณ ์๊ฐํ๊ณ , ๊ทธ๋์ ์ฒ์์ ๋ชจ๋ธ์ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๊ทธ๋ฆ์ด๋ผ๊ณ ์๊ฐํ์๋ค. ์ปจํธ๋กค์ด ๋ชจ๋ ๊ธฐ๋ฅ์ ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋๋ก ์ค๊ณํ๋ ๋ฐฉํฅ์ด ์ ์ง ๋ณด์์ ๋ ์ ํฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง๋ง, ์ปจํธ๋กค์ ์ ์๋ฅผ ์๊ฐํด ๋ดค์ ๋, "์ค๊ณ์", "ํต๋ก"์ด๋ฌํ ํค์๋๊ฐ ๋ถ๋๋ค๋ ๊ฒ๊ณผ "์ปจํธ๋กค์ ์ฌ์ฌ์ฉ์ ์ ํ์ง ์๋๋ค"๋ผ๋ ๋ง์ ๊ณ ๋ คํด. ์ปจํธ๋กค์ ์ ๋ง ์ฐ๊ฒฐ์์ผ์ฃผ๊ณ ๋ทฐ์ ๋ชจ๋ธ์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ ์ ๋์ ๊ธฐ๋ฅ๋ง์ ๊ตฌํํ๊ณ , ๋ชจ๋ธ์ ์ค์ ์ ์ผ๋ก ๊ตฌํํ๋ ๋ฐฉํฅ์ผ๋ก ์ค์ ํ๋ค.
๋๋ฌธ์ ํ๋ก์ ํธ ๊ตฌ์กฐ์ ๊ฐ์ด FruitStore
์ JuiceMaker
๋ชจ๋ธ์ด ์๊ณ , MainViewController
์ ManagingStockViewController
์ปจํธ๋กค๋ฌ๊ฐ ์กด์ฌํ๋ค. ํ์ง๋ง, ios์์ View์ Controller๊ฐ ๋งค์ฐ ๋ฐ์ ํด ์๋ค๋ ํน์ฑ์ด ์์ด, ํ๋ก์ ํธ๊ฐ ์งํ๋๋ฉฐ ๋ชจ๋ธ์ ๊ธฐ๋ฅ์ด ์ค๊ณ , ์ปจํธ๋กค๋ฌ์ ์ญํ ์ด ์ ์ ์ปค์ง๋ ํ์์ ๋ฐ๊ฒฌํ๋ค. ์ด๋ฌํ ์ ์ ๋ณด์ํ๊ธฐ ์ํด ๋ค์ํ ๋์์ธ ํจํด์ ๊ณต๋ถํด์ผ ํ๋ค๋ ์๊ฐ์ ๊ฐ์ง ์ ์์๋ค.
delegate
delegate ํจํด์ด๋, ์๋ ๋์ ์ค๋ธ์ ํธ๊ฐ ์ฒ๋ฆฌํ ๊ถํ์ ๊ฐ์ง๊ณ ์์ด์ ์ฒ๋ฆฌํด์ผ ํ ์ผ์ ๋ค๋ฅธ ์ค๋ธ์ ํธ์๊ฒ ๊ถํ์ ๋๊ฒจ์ฃผ์ด์ ๋ค๋ฅธ ์ค๋ธ์ ํธ์์ ์ฒ๋ฆฌํ๋๋ก ํด์ฃผ๋ ํจํด์ด๋ค.
manage ๋ทฐ์์ main ๋ทฐ๋ก ์ด๋ ํ ๋์๋ ๋ทฐ์ ์๋ช ์ฃผ๊ธฐ ๋๋ฌธ์ (๋ชจ๋ฌ๋ก ์ฐฝ์ ๋์ ๊ธฐ ๋๋ฌธ์ ๋ค์ main ์ผ๋ก ๋์์ฌ ๋์ viewWillAppear ๊ฐ ์คํ๋์ง ์๋๋ค๋ ์ ์์) manage ๋ทฐ๊ฐ ์ฌ๋ผ์ง ๋ ๋ผ๋ฒจ์ ๊ฐ์ ์ ๋ฐ์ดํธ ํด์ฃผ์ด์ผ ํ๋ค. ๊ทธ๋์ delegate ํจํด์ ์ด์ฉํด์ manage ๋ทฐ๊ฐ ์ฌ๋ผ์ง๋, main ๋ทฐ์์ ๋ผ๋ฒจ์ ๊ฐ์ด ๋ณํ๋๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
protocol delegate ํจํด์ ์ฌ์ฉํ๋ฉด์, ๊ฐ์ฒด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ธฐ ์ํด์ protocol์ ์ฌ์ฉํ์๋ค.
protocol Delegator: AnyObject {
var stock: [Fruit: Int]? { get set }
var delegate: Updateable? { get set }
}
private func setUpDelegate(_ viewNavigation: UINavigationController) {
guard let topView = viewNavigation.topViewController as? Delegator else { return }
topView.stock = juiceMaker.fruitStore.stock
topView.delegate = self
}
private func moveManagingStockView() -> UINavigationController? {
guard let managingStockVN = self.storyboard?.instantiateViewController(withIdentifier: "ManagingStockViewNavigation") as? UINavigationController else { return nil }
self.present(managingStockVN, animated: true, completion: nil)
return managingStockVN
}
๊ทธ๋ฆฌ๊ณ ํ๋ฉด์ ์ด๋ ํ ๋, ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ด๊ธฐ ์ํด์ ๋ค๋ฅธ Navigation Controller ๋ฅผ ์ฐ๊ฒฐํด๋ ๋ฌธ์ ๊ฐ ์๊ธฐ์ง ์๋๋ก ๋ค์ด ์บ์คํ ์ ํ protocol ์ ๋ง๋ค์ด ์ฌ์ฉํ๋ค. (Delegator ๋ฅผ ์ฑํํ ๋ทฐ์ด๊ธฐ๋ง ํ๋ฉด ํ๋ทฐ๋ก ์ด๋ค ๋ทฐ๊ฐ ์๋ ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค.
auto Layout stack view ๋ฅผ ์ด์ฉํด ์ฐ๊ด๋ ์ด๋ฏธ์ง, ๋ผ๋ฒจ ์คํ ํผ๋ฅผ ๋ฌถ๊ณ ๋ ๊ทธ๋ฌํ stack view ๋ค์ ํ๋์ stack view ๋ก ๋ฌถ์ด์ auto Layout ์ ์ ์ฉํ๋ค.