๐ฅ SwiftUI๋ ์ ์ธํ์ด๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋๊ฒ์ ์ ์ธํ๋ฉด SwifUI๊ฐ ์๋์ผ๋ก ๊ณ์ฐํ์ง๋ง, SwiftUI๊ฐ ๋ค์์ ๋ฌด์์ ํ๋์ง ์ข ๋ ์ดํดํ๊ณ ๋ ์ ํ์ฉํด๋ณด์
โญ๏ธ SwiftUI๋ ID, LifeTime, Dependency๋ก ๋ณ๊ฒฝํด์ผํ ์ฌํญ, ๋ฐฉ๋ฒ, ์๊ธฐ๋ฅผ ๊ฒฐ์ ํ์ฌ ๋์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํจ
SwiftUI๊ฐ ์ฑ์ ์ฌ๋ฌ ์ ๋ฐ์ดํธ ์ฌํญ ์ค ์์๋ฅผ ๋์ผํ๊ฒ ๋ณด๊ฑฐ๋, ๋ณ๊ฐ๋ก ์ธ์ํ๋ ๋ฐฉ๋ฒ
๋์ผ ๋ทฐ์ธ์ง ์๋์ง์ ๋ฐ๋ผ SwiftUI๊ฐ ๋ทฐ ์ ํ ๋ฐฉ์์ด ๋ฌ๋ผ์ง ์ ์์
โ ย Same View Identity โ Same UI element: Different state
โ Different View Identity โ Distinct UI elements
custom ํน์ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ์๋ณ์ ์ฌ์ฉ
์ด๋ฆ ํน์ ์๋ณ์ ํ ๋น์ผ๋ก ๊ตฌ๋ณํ๋ ๊ฒ
ex. pointer identity in UIKit, AppKit
๋์ผํ ์ฐธ์กฐ๊ฐ์ ๊ฐ์ง๋ฉด ๋์ผํ ๋ทฐ์์ ๋ณด์ฅ
๐ฅย SwiftUI๋ ๊ฐํ์ ์ด๊ธฐ ๋๋ฌธ์ pointer๋ฅผ ๊ฐ์ง ์์
ํ์ง๋ง id ๋งค๊ฐ๋ณ์๋ฅผ ํตํด ๋ช ์์ ID๋ฅผ ์ฌ์ฉํ๊ธด ํจ
๐ย ์ด๊ฒ์ ์ฅ์ : ๋ชจ๋ ๋ทฐ๋ฅผ ๋ช ์์ ์ผ๋ก ์๋ณํ ํ์๊ฐ ์๊ณ , ์ฐธ์กฐํด์ผํ ๋ทฐ๋ง ์๋ณํ ์ ์์
๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ด์ง๋ง ๋ชจ๋ ์ด๋ฆ์ ์ถ์ ํด์ผํ๋ค๋ ๋จ์ ์ด ์กด์ฌ
<aside> ๐ Every view has an identity โ ๋ช ์์ ์๋ณ์๊ฐ ์์ด๋ ๋ชจ๋ ๋ทฐ๋ ์๋ณ์๋ฅผ ๊ฐ์ง โ SwiftUI๋ ๋ทฐ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ทฐ์ ๋ํ ์์์ ID๋ฅผ ์์ฑํจ
</aside>
๋ทฐ ๊ณ์ธต ๊ตฌ์กฐ์์์ ์ ํ๊ณผ ์์น์ ๋ฐ๋ผ ๋ทฐ๋ฅผ ๊ตฌ๋ณ
โ ๋ทฐ๋ฅผ ๊ตฌ๋ณํ๊ธฐ ์ํด ์๋์ ๋ฐฐ์ด์ ์ฌ์ฉ
var body: some View {
if rescueDogs.isEmpty {
// True View
AdoptionDirectory(selection: $rescueDogs)
} else {
// False View
DogList(rescueDogs)
}
}
โ ๋ทฐ๋ค์ด ํ์ ์์น์ ์ ์ ์ผ๋ก ์ ์ง๋จ์ด ๋ณด์ฅ๋ ๊ฒฝ์ฐ, ๋ทฐ๋ฅผ ๋ช ํํ๊ฒ ์๋ณ
โ some View์ ํ์ ์ if ๊ตฌ๋ฌธ์ ๋ณด๊ณ ConditionalContent<True, False> ํ์ ์ผ๋ก ๋์ค๊ฒ ๋จ
์ด๊ฒ์ด static composite type
์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ placeholder
โ view ํ๋กํ ์ฝ์ ViewBuilder๋ฅผ ํตํด ์์์ ์ผ๋ก body๋ฅผ ๋จ์ผ์ generic View๋ก ๊ฐ์
์ด๋ฌํ generic type์ด True View์ False View๋ฅผ ๊ตฌ๋ณํ์ฌ ๋ณด์ฅํ๊ฒ ๋๊ณ , ์์์ ์ด๊ณ ์์ ์ ์ธ View ID๊ฐ ๊ฐ๊ฐ ํ ๋น๋จ
โ ํ์ฌ ํ๋ผ๋ฏธํฐ ๋ด๋ถ์ ์ผํญ์ฐ์ฐ์๋ก ๊ตฌ๋ถํ๊ฒ ๋๋ฉด ๋จ์ผ ID๋ก ์ธ์ํ๊ฒ ๋จ
func view(for dog: Dog) -> some View {
var dogView: AnyView
if dog.breed == .bulldog {
dogView = AnyView(BulldogView())
} else if dog.breed == .pomeranian {
dogView = AnyView(PomeranianView())
} else if dog.breed = .borderCollie {
dogView = AnyView(BorderCollieView())
if sheepNearby {
dogView = AnyView(HStack {
dogView
SheepView()
})
}
} else {
dogView = AnyView(UnknownBreedView())
}
return dogView
}
๐ฅ ์ด๋ฐ ๊ฒฝ์ฐ ๋ฐํ ๊ฐ์ด AnyView๊ฐ ๋์ด ํ์ ์ด ์ง์์ง๊ฒ ๋จ
@ViewBuilder
func view(for dog: Dog) -> some View {
var dogView: AnyView
if dog.breed == .bulldog {
BulldogView()
} else if dog.breed == .pomeranian {
PomeranianView()
} else if dog.breed = .borderCollie {
HStack {
BorderCollieView()
if sheepNearby {
SheepView()
}
}
} else {
UnknownBreedView()
}
}
โ๏ธย function์ ViewBuilder๋ก ์ถ๋ก ํ์ง ์์ง๋ง, ViewBuilder ์์ฑ์ ์ง์ ์ ์ฉํ์ฌ View ํ๋กํ ์ฝ์ด ์์์ ์ผ๋ก body ํ๋กํผํฐ๋ฅผ ๋ํํ๋ ๊ฑฐ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค