์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 0์ด๋์ด์๋๊ธธ
- algoritm
- discardableResult
- SOPT
- algorithm
- SwiftUI
- BFS
- ๊ธฐ์ด๋ฌธ๋ฒ
- duno
- ๋์ ๊ณํ๋ฒ
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ค์ด๋๋ฏนํ๋ก๊ทธ๋๋ฐ
- ์ด์งํ์
- SQL
- ๊ณ ๋์ kit
- APPJAM
- dfs
- binarySearch
- Swift
- SwiftUI ํํ ๋ฆฌ์ผ
- GroupBy
- HAVIT
- ์ฐ์ํ์ค๋ถ๋ถ์์ด์ํฉ
- Til
- GCD
- IOS
- URLSession
- DynamicProgramming
- SwiftUI Tutorials
- concurrency
- Today
- Total
suvera-dev ๐ฅฆ
SwiftUI) SwiftUI Essentials 3 - Handling User Input ๋ณธ๋ฌธ
์ค์ ํํ ๋ฆฌ์ผ 3๋ฒ์งธ ์ ๋๋ค !
Landmarks ์ฑ์์ ์ฌ์ฉ์๋ ์ฆ๊ฒจ์ฐพ๋ ์ฅ์๋ฅผ ํ์ํ๊ณ , ๊ทธ ๋ชฉ๋ก์ ํํฐ๋งํ์ฌ ์ฆ๊ฒจ์ฐพ๊ธฐ๋ง ํ์ํ ์ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ํด ๋จผ์ ์ฌ์ฉ์๊ฐ ์ฆ๊ฒจ์ฐพ๊ธฐ์๋ง ์ง์คํ ์ ์๋ ์ค์์น๋ฅผ ๋ชฉ๋ก์ ์ถ๊ฐํ ๋ค์,
์ฌ์ฉ์๊ฐ ์ฆ๊ฒจ์ฐพ๋ landmark๋ฅผ ํ์ํ๊ธฐ ์ํด ๋ณ ๋ชจ์์ ๋ฒํผ์ ์ถ๊ฐํ ๊ฒ์ ๋๋ค.
1. ์ฌ์ฉ์์ ์ฆ๊ฒจ์ฐพ๊ธฐ ํ์ํ๊ธฐ
์ฌ์ฉ์๊ฐ ํ๋์ ์์ ์ ์ฆ๊ฒจ์ฐพ๋ ์ฅ์๋ฅผ ๋ณผ ์ ์๋๋ก ๋ชฉ๋ก์ ๊ฐ์ ํ๋ ๊ฒ์ ์์ํฉ๋๋ค.
Landmark ๊ตฌ์กฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ์ฌ ๋๋๋งํฌ์ ์ด๊ธฐ ์ํ๋ฅผ ์ฆ๊ฒจ์ฐพ๋ ์ฅ์๋ก ์ฝ์ ์ ์๋๋ก ํ๊ณ ,
์ฆ๊ฒจ์ฐพ๋ landmark๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฐ LandmarkRow์ ๋ณํ๋ฅผ ์ถ๊ฐํ์ธ์.
1. isFavorite ๋ผ๋ ํ๋กํผํฐ๋ฅผ Landmark ๋ชจ๋ธ์ ์ถ๊ฐํด์ฃผ๊ธฐ.
( landmarkData.json ํ์ผ ์์ ๊ฐ์ ์ด๋ฆ์ ํค๊ฐ ์์ผ๋ฏ๋ก, Codable ํ๋กํ ์ฝ ์ฑํ์ ํตํด์ ํด๋น ํค์ ์ฐ๊ด๋ ๊ฐ์ ์ป์ ์ ์์ด์.)
2. LandmarkRow์ isFavorite ๊ฐ์ด true ์ผ๋ ๊ฝ์ฐฌ ๋ณ ๋ชจ์ ์ด๋ฏธ์ง๋ฅผ ์ถ๊ฐ. ์์์ yellow
// Landmark ๋ชจ๋ธ์ ์๋ ํ๋กํผํฐ ์ถ๊ฐ
var isFavorite: Bool
// SwiftUI ๋ธ๋ก์์๋ if ๋ฌธ์ ์ฌ์ฉํ์ฌ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ทฐ๋ฅผ ์กฐ๊ฑด๋ถ๋ก ํฌํจ์ํฌ ์ ์์ต๋๋ค.
if landmark.isFavorite {
Image(systemName: "star.fill")
.foregroundColor(.yellow)
}
2. ๋ฆฌ์คํธ ๋ทฐ ํํฐ๋งํ๊ธฐ
๋ชจ๋ landmark ๋๋ ์ฌ์ฉ์์ ์ฆ๊ฒจ์ฐพ๊ธฐ๋ง ํ์ํ๋๋ก ๋ชฉ๋ก ๋ณด๊ธฐ๋ฅผ ์ฌ์ฉ์ ์ ์ํ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ํด LandmarkList ํ์ ์ ์ฝ๊ฐ์ state๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
State๋ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณ๊ฒฝ๋ ์ ์๋ ๊ฐ ๋๋ ๊ฐ ์งํฉ์ด๋ฉฐ, ๋ทฐ์ ๋์, ์ฝํ ์ธ ๋๋ ๋ ์ด์์์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๋ทฐ์ state๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด @State ์์ฑ์ ๊ฐ์ง ์์ฑ์ ์ฌ์ฉํฉ๋๋ค.
1. ๋๋๋งํฌ ๋ฆฌ์คํธ ๋ทฐ์ false๋ก ์ด๊ธฐ๊ฐ์ด ์ค์ ๋ showFavoritesOnly๋ผ๋ @State ์์ฑ์ ์ถ๊ฐํ์ธ์.
2. ๋๋๋งํฌ ๋ฆฌ์คํธ์ showFavoritesOnly ํ๋กํผํฐ ๋ฐ ๊ฐ landmark.isFavorite ๊ฐ์ ํ์ธํ์ฌ ํํฐ๋ง๋ ๋ฒ์ ์ landmarks ๋ชฉ๋ก์ ๊ณ์ฐํ์ธ์.
@State private var showFavoritesOnly = false
var filteredLandMarks: [Landmark] {
landmarks.filter { landmark in
(!showFavoritesOnly || landmark.isFavorite)
}
}
- ์ด๋ ๊ฒ showFavoritesOnly ์์ฑ๊ณผ ๊ฐ landmark์ isFavorite ๊ฐ์ ํ์ธํ์ฌ ํํฐ๋ง๋ ๋ฒ์ ์ landmarks ๋ชฉ๋ก์ ๋ฐํํ๋ ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํด์ฃผ์ธ์ !
3. ๊ทธ๋ฆฌ๊ณ ๋ฆฌ์คํธ ๋ทฐ์ ๋ค์ด๊ฐ๋ landmarks๋ฅผ filteredLandMarks ๋ก ๋ฐ๊ฟ์ค๋๋ค !
List(filteredLandmarks) { landmark in
3. ํ ๊ธ ๋ฉ๋ด ๋ง๋ค๊ธฐ
์ฌ์ฉ์๊ฐ ๋ชฉ๋ก ํํฐ๋ฅผ ์ ์ดํ ์ ์๋๋ก showFavoritesOnly์ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ ์ปจํธ๋กค์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
( ํํฐ๋ง ๋ ๊ฒ๋ง ๋ณผ์ง, ์ ์ฒด ๋ชฉ๋ก์ ๋ค ๋ณผ์ง ํ ๊ธ๋ก ์ ์ด.)
์ด๋ฅผ ์ํด toggle control์ binding์ ์ ๋ฌํฉ๋๋ค.
binding์ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์ํ์ ๋ํ ์ฐธ์กฐ ์ญํ ์ ํฉ๋๋ค.
์ฌ์ฉ์๊ฐ ํ ๊ธ์ ๋๊ณ ์ผ๊ณ ๋ค์ ๋ ๋, ์ปจํธ๋กค์ ๋ฐ์ธ๋ฉ์ ์ฌ์ฉํ์ฌ ๋ทฐ์ ์ํ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
1. ๋๋๋งํฌ๋ฅผ ํ์ผ๋ก ๋ณํํ๊ธฐ ์ํด ์ค์ฒฉ๋ ForEach ๊ทธ๋ฃน์ ๋ง๋ญ๋๋ค.
- ๋ฆฌ์คํธ์์ ์ ์ ๋ฐ ๋์ ๋ทฐ๋ฅผ ๊ฒฐํฉํ๊ฑฐ๋ ๋ ๊ฐ ์ด์์ ์๋ก ๋ค๋ฅธ ๋์ ๋ทฐ ๊ทธ๋ฃน์ ๊ฒฐํฉํด์ผํ๋ ๊ฒฝ์ฐ,
๋ฐ์ดํฐ ์ปฌ๋ ์ ์ List์ ์ ๋ฌํ๋ ๋์ ForEach ํ์ ์ ์ฌ์ฉํฉ๋๋ค.
2. List ๋ทฐ์ ์ฒซ ๋ฒ์งธ ์์์ผ๋ก showFavoritesOnly์ ๋ํ ๋ฐ์ธ๋ฉ์ ์ ๋ฌํ๋ ํ ๊ธ ๋ทฐ(Toggle)๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ์ํ ๋ณ์๋ ๊ทธ ์์ฑ ์ค ํ๋์ ๋ํ ๋ฐ์ธ๋ฉ์ ์ก์ธ์คํ๊ธฐ ์ํด $ ์ ๋์ฌ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
var body: some View {
NavigationView {
List {
Toggle(isOn: $showFavoritesOnly) {
Text("Favorites only")
}
ForEach(filteredLandMarks) { landmark in
NavigationLink {
LandmarkDetail(landmark: landmark)
} label: {
LandmarkRow(landmark: landmark)
}
}
}
.navigationTitle("Landmarks")
}
}
4. ์ ์ฅ์ ์ํด Observable ๊ฐ์ฒด ์ฌ์ฉํ๊ธฐ
์ฌ์ฉ์๊ฐ ํน์ landmark๋ฅผ ์ฆ๊ฒจ์ฐพ๊ธฐ๋ก ์ ํํ๋๋ก ์ค๋นํ๊ธฐ ์ํด landmark ๋ฐ์ดํฐ๋ฅผ observable object์ ์ ์ฅํฉ๋๋ค.
Observable object๋ SwiftUI์ ํ๊ฒฝ์์ ์ ์ฅ๋ ๋ทฐ์ ๋ฐ์ธ๋ฉ ๋ ์ ์๋ ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ ๊ฐ์ฒด์ ๋๋ค.
SwiftUI๋ ๋ทฐ์ ์ํฅ์ ์ค ์ ์๋ observable object์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ชจ๋ํฐ๋งํ๊ณ ๋ณ๊ฒฝ ํ ์ฌ๋ฐ๋ฅธ ๋ฒ์ ์ ๋ทฐ๋ฅผ ํ์ํฉ๋๋ค.
1. ModelData ํ์ผ์์ Combine ํ๋ ์์ํฌ๋ฅผ importํ๊ณ , ObservableObject ํ๋กํ ์ฝ์ ์ค์ํ๋ ์๋ก์ด ๋ชจ๋ธ ํ์ ์ ์ ์ธํฉ๋๋ค.
- SwiftUI๋ ObservableObject๋ฅผ ๊ตฌ๋ ํ๊ณ , ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์๋ก ๊ณ ์ณ์ผ ํ๋ ๋ชจ๋ ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
2. ๋๋๋งํฌ ๋ฐฐ์ด์ Observable Object ์์ผ๋ก ์ด๋.
3. @Published ์์ฑ์ ๋๋๋งํฌ ๋ฐฐ์ด์ ์ถ๊ฐ
- ObservableObject๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐํ(publish)ํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ด๋ฅผ ๊ตฌ๋ ํ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ด ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ ์ ์์ต๋๋ค.
import Combine
final class ModelData: ObservableObject {
@Published var landmarks: [Landmark] = load("landmarkData.json")
}
5. ๋ทฐ์์ ๋ชจ๋ธ ๊ฐ์ฒด ์ฑํํ๊ธฐ
์ด์ ModelData ๊ฐ์ฒด๋ฅผ ๋ง๋ค์์ผ๋ฏ๋ก, ์ฑ์ ๋ฐ์ดํฐ ์ ์ฅ์๋ก ์ฑํํ๋๋ก ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํฉ๋๋ค.
1. LandmarkList.swift ํ์ผ์์, view์ @EnvironmentObject ํ๋กํผํฐ ์ ์ธ์ ์ถ๊ฐํ๊ณ , preview์ environmentObject(_:) modifier๋ฅผ ์ถ๊ฐํ์ธ์.
- modelData ํ๋กํผํฐ๋ ๋ถ๋ชจ ๋ทฐ์ environmentObject(_:) ์์ ์๊ฐ ์ ์ฉ๋์ด ์์ผ๋ฉด ์๋์ผ๋ก ๊ฐ์ ๊ฐ์ ธ์ต๋๋ค.
2. ๋๋๋งํฌ๋ฅผ ํํฐ๋งํ ๋ ๋ฐ์ดํฐ๋ก modelData.landmarks๋ฅผ ์ฌ์ฉํ์ธ์.
struct LandmarkList: View {
@EnvironmentObject var modelData: ModelData
@State private var showFavoritesOnly = false
var filteredLandmarks: [Landmark] {
modelData.landmarks.filter { landmark in
(!showFavoritesOnly || landmark.isFavorite)
}
}
...
struct LandmarkList_Previews: PreviewProvider {
static var previews: some View {
LandmarkList()
.environmentObject(ModelData())
}
}
3. LandmarkDetail ๋ทฐ๋ฅผ ํ๊ฒฝ(Environment)์ ์๋ ModelData ๊ฐ์ฒด์ ํจ๊ป ์๋ํ๋๋ก ์ ๋ฐ์ดํธํ์ธ์.
struct LandmarkDetail_Previews: PreviewProvider {
static var previews: some View {
LandmarkDetail(landmark: ModelData().landmarks[0])
}
}
4. LandmarkRow ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ModelData ๊ฐ์ฒด์ ํจ๊ป ์๋ํ๋๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
struct LandmarkRow_Previews: PreviewProvider {
static var landmarks = ModelData().landmarks
5. ContentView์ preview๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ํ๊ฒฝ(Environment)์ ์ถ๊ฐํ์ฌ ๋ชจ๋ ํ์ ๋ทฐ์์ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค.
- ๋ง์ฝ ๋ฏธ๋ฆฌ๋ณด๊ธฐํ๋ ๋ทฐ์์ ํ์ํ ํ์ ๋ทฐ๊ฐ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ํ๊ฒฝ(environment)์ผ๋ก๋ถํฐ ๊ฐ์ ธ์ค์ง ์์ ๊ฒฝ์ฐ, ๋ทฐ๊ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ์คํจํฉ๋๋ค. ์ด ๊ฒฝ์ฐ, ํด๋น ํ์ ๋ทฐ์ environmentObject(_:) ์์ ์๋ฅผ ์ถ๊ฐํด์ค์ผ ํฉ๋๋ค.
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
.environmentObject(ModelData())
}
}
๋ค์์ผ๋ก, ์๋ฎฌ๋ ์ดํฐ๋ ๊ธฐ๊ธฐ์์ ์ฑ์ ์คํํ ๋ ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ํ๊ฒฝ(Environment)์ ๋ฃ์ด์ฃผ๊ธฐ ์ํด ์ฑ ์ธ์คํด์ค๋ฅผ ์ ๋ฐ์ดํธํ ๊ฒ์ ๋๋ค.
6. LandmarksApp์ ์ ๋ฐ์ดํธํ์ฌ model ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ณ environmentObject(_:) modifier๋ฅผ ์ฌ์ฉํ์ฌ ContentView์ ๊ณต๊ธํฉ๋๋ค.
- @StateObject ์์ฑ์ ์ฌ์ฉํ๋ฉด ์ฑ ๋ผ์ดํ ์ฌ์ดํด ๋์ ์ฃผ์ด์ง ์์ฑ์ ๋ํด ๋ชจ๋ธ ๊ฐ์ฒด๋ฅผ ํ ๋ฒ๋ง ์ด๊ธฐํํฉ๋๋ค. ์ฌ๊ธฐ์์ ๋ณด์ฌ์ฃผ๋ ๋๋ก ์ฑ ์ธ์คํด์ค์์ ์์ฑ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ฟ๋ง ์๋๋ผ ๋ทฐ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ ํด๋น๋ฉ๋๋ค.
@main
struct LandmarksApp: App {
@StateObject private var modelData = ModelData()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(modelData)
}
}
}
6. ๋๋๋งํฌ์ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒํผ ์์ฑํ๊ธฐ
Landmark ์ฑ์ ์ด์ landmark๋ค์ ํํฐ๋ง๋ ๋ทฐ์ ํํฐ๋ง๋์ง ์์ ๋ทฐ ๊ฐ์ ์ ํํ ์ ์์ง๋ง, ์ฆ๊ฒจ์ฐพ๊ธฐ landmark ๋ชฉ๋ก์ ์ฌ์ ํ ํ๋ ์ฝ๋ฉ๋์ด ์์ต๋๋ค.
์ฌ์ฉ์๊ฐ ์ฆ๊ฒจ์ฐพ๊ธฐ๋ฅผ ์ถ๊ฐํ๊ณ ์ ๊ฑฐํ ์ ์๋๋ก Landmark detail view์ ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒํผ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
1. ์ฌ์ฌ์ฉํ Favorite Button ํ์ผ ๋ง๋ค์ด์ฃผ๊ธฐ
2. isSet์ ๋ํ ๋ฐ์ธ๋ฉ์ ์ถ๊ฐํ์ฌ ๋ฒํผ์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ด๊ณ , ํ๋ฆฌ๋ทฐ์ ๋ํ ์์ ๊ฐ์ ์ ๊ณตํฉ๋๋ค.
- Binding์ ์ฌ์ฉํ๋ฉด, ์ด ๋ทฐ์์์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ดํฐ ์์ค๋ก ์ ๋ฌํฉ๋๋ค.
struct FavoriteButton: View {
@Binding var isSet: Bool
var body: some View {
Text(/*@START_MENU_TOKEN@*/"Hello, World!"/*@END_MENU_TOKEN@*/)
}
}
struct FavoriteButton_Previews: PreviewProvider {
static var previews: some View {
FavoriteButton(isSet: .constant(true))
}
}
3. isSet ์ํ๋ฅผ ํ ๊ธํ๋ ์ก์
์ ๊ฐ์ง๋ Button์ ๋ง๋ค๊ณ , ์ํ์ ๋ฐ๋ผ ๋ชจ์์ด ๋ณ๊ฒฝ๋๋๋ก ํฉ๋๋ค.
- ๋ฒํผ์ ๋ผ๋ฒจ๋ก ์ ๊ณตํ๋ ๋ฌธ์์ด์ iconOnly ๋ผ๋ฒจ ์คํ์ผ์ ์ฌ์ฉํ ๋ UI์ ๋ํ๋์ง ์์ง๋ง, VoiceOver๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผ์ฑ์ ํฅ์์ํต๋๋ค.
( VoiceOver ๊ฐ ๋ญ์ง ๋ชฐ๋ผ์ GPTํํ ๋ฌผ์ด๋ดค์ด์.)
VoiceOver๋ ์๊ฐ์ ์ผ๋ก ๋ณด์ด์ง ์๋ UI ์์๋ค์ ์์ฑ์ผ๋ก ์ค๋ช ํด์ฃผ๋ ๋๊ตฌ์ด๋ฉฐ, ์ด๋ฅผ ํตํด ์๊ฐ์ ์ธ ์ฅ์ ๋ฅผ ๊ฐ์ง ์ฌ์ฉ์๋ ์ฑ์ ์ด์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ผ๋ฒจ ๋ฌธ์์ด์ ์ ๊ณตํ์ฌ VoiceOver๋ฅผ ์ด์ฉํ๋ ์ฌ์ฉ์๊ฐ ๋ฒํผ ๊ธฐ๋ฅ์ ์ดํดํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
var body: some View {
Button {
isSet.toggle()
} label: {
Label("Toggle Favorite", systemImage: isSet ? "star.fil" : "star")
.labelStyle(.iconOnly)
.foregroundColor(isSet ? .yellow : .gray)
}
}
4. ํ๋ก์ ํธ๊ฐ ์ปค์ง๋ฉด ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๋ค์์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ๋ช ๊ฐ์ ๊ทธ๋ฃน์ ๋ ๋ง๋์ธ์.
- ํด๋๋ง์ ํด์คฌ์ต๋๋ค !
5. ๋ค์์ผ๋ก, ์ฆ๊ฒจ์ฐพ๊ธฐ ๋ฒํผ์ ์์ธ ๋ณด๊ธฐ ๋ทฐ์ ์ถ๊ฐํ๊ณ , ๋ฒํผ์ isSet ์์ฑ์ ํน์ landmark์ isFavorite ์์ฑ์ ๋ฐ์ธ๋ฉํฉ๋๋ค.
- ์
๋ ฅ๋ landmark์ model data๋ฅผ ๋น๊ตํ์ฌ ํด๋น landmark์ ์ธ๋ฑ์ค๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด, ํ๊ฒฝ์ model data์ ๋ํ ์ก์ธ์ค ๊ถํ์ด ํ์ํฉ๋๋ค.
@EnvironmentObject var modelData: ModelData
var landmark: Landmark
var landmarkIndex: Int {
modelData.landmarks.firstIndex(where: { $0.id == landmark.id })!
}
6. ์๋ก์ด FavoriteButton๊ณผ ํจ๊ป landmark์ ์ด๋ฆ์ HStack์ผ๋ก ๋ฌถ์ด์ ์ฌ์ฉํ๊ณ , isFavorite ์์ฑ์ $ ๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ธ๋ฉ์ ์ ๊ณตํ์ธ์.
- landmarkIndex์ modelData ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒํผ์ด ๋ชจ๋ธ ๊ฐ์ฒด์ ์ ์ฅ๋ landmark์ isFavorite ์์ฑ์ ์ ๋ฐ์ดํธํ๋๋กํฉ๋๋ค.
HStack {
Text(landmark.name)
.font(.title)
FavoriteButton(isSet: $modelData.landmarks[landmarkIndex].isFavorite)
}
๋ฆฌ์คํธ ๋ทฐ๋ก ๋์๊ฐ์ ๋ผ์ด๋ธ ํ๋ฆฌ๋ทฐ๋ก ํ์ธํด๋ณด์ธ์ !
๋ฆฌ์คํธ์์ ๋ํ ์ผ๋ก ์ด๋ํ๊ณ ๋ฒํผ์ ๋๋ฅด๋ฉด, ๋ชฉ๋ก์ผ๋ก ๋์์๋ ํด๋น ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ง๋ฉ๋๋ค.
๋ ๋ทฐ๊ฐ ํ๊ฒฝ(environment)์์ ๋์ผํ ๋ชจ๋ธ ๊ฐ์ฒด(model object)์ ์ก์ธ์คํ๊ธฐ ๋๋ฌธ์ ๋ ๋ทฐ๊ฐ ์ผ๊ด์ฑ์ ์ ์งํฉ๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ๊ถ๊ธํ๋ ๋ถ๋ถ - @State ๋ณ์๋ฅผ ๊ณ์ private๋ก ์ ์ธํ๋ ์ด์ ?
@State ๋ณ์๋ฅผ private์ผ๋ก ์ ์ธํ๋ ๊ฒ์ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ ์ค ํ๋์ ๋๋ค.
์ด์ ๋ @State ๋ณ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค SwiftUI๊ฐ ํด๋น View๋ฅผ ์ ๋ฐ์ดํธํ๊ธฐ ๋๋ฌธ์,
๋ถํ์ํ ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๋๋ก View์ ์ต์ํ์ ๋ถ๋ถ๋ง ๋ค์ ๊ทธ๋ ค์ง๋๋ก ํ๋ ๊ฒ์ด ์ฑ๋ฅ์ ์ผ๋ก ์ข๊ธฐ ๋๋ฌธ์ ๋๋ค.
ํ์ง๋ง, @State ๋ณ์๊ฐ private์ผ๋ก ์ ์ธ๋์ด์ผ๋ง ํ๋ ๊ฒ์ ์๋๋๋ค.
๋ง์ฝ ๋ค๋ฅธ View์์ ํด๋น ๋ณ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ์๋, @State ๋ณ์๋ฅผ ํด๋น View์ ์์ View์์ ์ ์ธํ๊ณ ,
binding์ ์ฌ์ฉํ์ฌ ํ์ View๋ก ์ ๋ฌํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์, @State ๋ณ์๋ฅผ private์ผ๋ก ์ ์ธํ ์ง๋ ๊ฐ๋ฐ์์ ํ๋จ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์์ต๋๋ค.
'iOS > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SwiftUI) Drawing and Animation 1 - Drawing Paths and Shapes (0) | 2023.04.02 |
---|---|
SwiftUI) SwiftUI Essentials - 2 Building Lists and Navigation (0) | 2023.03.29 |
SwiftUI) SwiftUI Essentials (8) | 2023.03.29 |