유저가 즐겨찾기 장소를 표시할 수 있고, 즐겨찾기 장소만 볼 수 있도록 필터 기능을 만들어 봅니다.


1. 유저의 즐겨찾기 장소 표시하기

2. 리스트 뷰에 필터링 적용하기

// 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") // 내비게이션 바의 제목을 설정해줍니다.
        }
    }
}

Untitled

3. 즐겨찾기만 보기 위한 Toggle 스위치 추가해주기

**// 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") // 내비게이션 바의 제목을 설정해줍니다.
        }
    }
}

Untitled

Untitled

4. 스토리지에 저장하기 위해 Observable Object 사용하기