유저가 즐겨찾기 장소를 표시할 수 있고, 즐겨찾기 장소만 볼 수 있도록 필터 기능을 만들어 봅니다.
Landmark.swift 파일에서 isFavorite 프로퍼티를 추가해줍니다.
struct Landmark: Hashable, Codable, Identifiable {
var id: Int
var name: String
var park: String
var state: String
var description: String
**var isFavorite: Bool // 즐겨찾기 여부 프로퍼티**
...
LandmarkRow.swift 파일에서 행에 즐겨찾기 표시를 추가해준다.
struct LandmarkRow: View {
var landmark: Landmark
var body: some View {
HStack {
landmark.image // landmark.image는 Image() 뷰임
.resizable()
.frame(width: 50, height: 50)
Text(landmark.name)
Spacer() // 랜드마크 정보를 행의 왼쪽으로 밀어주기 위해 넣어줌
**if landmark.isFavorite {
Image(systemName: "star.fill")
.foregroundColor(.yellow)
}**
}
}
}

// LandmarkList.swift
import SwiftUI
struct LandmarkList: View {
**@State private var showFavoritesOnly = false // 즐겨찾기 여부에 따른 필터링을 위한 state 변수**
**var filteredLandmarks: [Landmark] {
landmarks.filter { landmark in
/*
showFavoritesOnly가 true면 landmark.isFavorite==true인 랜드마크만
showFavoritesOnly가 true면 모든 랜드마크
*/
(!showFavoritesOnly || landmark.isFavorite)
}
}**
var body: some View {
NavigationView { // 리스트를 내비게이션 뷰에 임베드 해줍니다.
// List의 클로저에 LandmarkDetail() 뷰를 목적지로 하는 NavigationLink를 연결해줍니다.
List(**filteredLandmarks**) { landmark in
NavigationLink {
LandmarkDetail(landmark: landmark)
} label: {
LandmarkRow(landmark: landmark)
}
}
.navigationTitle("Landmarks") // 내비게이션 바의 제목을 설정해줍니다.
}
}
}

**// LandmarkList.swift**
import SwiftUI
struct LandmarkList: View {
@State private var showFavoritesOnly = false // 즐겨찾기 여부에 따른 필터링을 위한 state 변수
var filteredLandmarks: [Landmark] {
landmarks.filter { landmark in
/*
showFavoritesOnly가 true면 landmark.isFavorite==true인 랜드마크만
showFavoritesOnly가 true면 모든 랜드마크
*/
(!showFavoritesOnly || landmark.isFavorite)
}
}
var body: some View {
NavigationView { // 리스트를 내비게이션 뷰에 임베드 해줍니다.
****// List의 클로저에 LandmarkDetail() 뷰를 목적지로 하는 NavigationLink를 연결해줍니다.
**List {
Toggle(isOn: $showFavoritesOnly) {
Text("Favorites only")
}
ForEach(filteredLandmarks) { landmark in
NavigationLink {
LandmarkDetail(landmark: landmark)
} label: {
LandmarkRow(landmark: landmark)
}
}
}**
.navigationTitle("Landmarks") // 내비게이션 바의 제목을 설정해줍니다.
}
}
}

