스파르타 코딩 클럽 - iOS 스타터 6기/본 캠프

67. 스파르타 코딩 클럽 - 최종 팀 프로젝트 #9

seongpil Heo 2025. 6. 18. 21:48

  🎯  Trouble Shooting

[ 1.  Duplicate item StoreInfo ]

error Message

Thread 1: Fatal error: Duplicate item StoreInfo(displayName: "버거킹 신림역점", 
primaryTypeDisplayName: "패스트푸드점", formattedAddress: "대한민국 서울특별시 관악구 서원동 86-42",
latitude: 37.482641, longitude: 126.93015550000001, rating: 4.1, 
googleMapsUri: "https://maps.google.com/?cid=4429034559381451748", 
userRatingCount: 102, photosNames: "https://lh3.googleusercontent.com/place-photos/
AJnk2cwFntQeWbiEOlXEdIUyDF7SEZn0av4BCY-w-QEMXZ5oljiFXQAHpvJs23T2RAtOLsTCyJqMIavJmu9dEgZqZQakvA0Y2

 

원인 : 이 에러는 StoreInfo 타입의 객체가 중복되어 Set이나 Dictionary 등 고유성을 요구하는 컬렉션에 삽입되려고 할 때 발생합니다. 즉, StoreInfo가 Equatable 및 Hashable을 구현하고 있고, 동일한 정보를 가진 객체가 이미 컬렉션에 존재할 때 크래시가 납니다.

 

해결 : StoreSection의 identity를 가게 이름에서 UUID로 설정

extension StoreInfo: IdentifiableType {
    var identity: String { return UUID().uuidString } // 고유 식별자로 가게명 사용
}

struct StoreSection {
    var identity: String
    var items: [StoreInfo]
    
    init(items: [StoreInfo]) {
        self.identity = UUID().uuidString
        self.items = items
    }
}

  👨🏻‍💻  오늘의 작업 

[ 1. 음식 키워드를 Home View에서 받아와서 Detail Reactor에서 사용 ]

1.1 음식 키워드를 목데이터에서 Home View에서 받아온 키워드로 사용

 

homeVC

reactor.pulse(\.$pushDetailViewWithData)
    .compactMap { $0 }
    .bind(onNext: {
        print("다음 뷰 push, data: \($0.keywords), \($0.title)")
        let reactor = DetailReactor(sectionData: $0)
        let vc = DetailViewController(reactor: reactor)
        self.navigationController?.pushViewController(vc, animated: true)
    })
    .disposed(by: disposeBag)

homeVC에서 DetailVC로 SectionData를 넘겨줌

 

detailVC

typealias Reactor = DetailReactor
let reactor: DetailReactor

init(reactor: DetailReactor) {
    self.reactor = reactor
    super.init(nibName: nil, bundle: nil)
}

detailVC에서 init 설정

 

detailReactor

var selectedKeywords: [String] // home에서 전달받는 검색 키워드
var title: String

init(sectionData: SectionData) {
    self.selectedKeywords = sectionData.keywords
    self.title = sectionData.title
    self.initialState = State()
}


// homeVC에서 받아온 키워드 사용
let firstRequest = fetchStoreInfosWithImages(textQuery: selectedKeywords[0], 
                                            centerLat: centerLat, 
                                            centerLon: centerLon)
let secondRequest = fetchStoreInfosWithImages(textQuery: selectedKeywords[1], 
                                            centerLat: centerLat, 
                                            centerLon: centerLon)

homeVC에서 받아온 setcionData를 detailReactor에서 초기 설정

네트워크 통신 시 homeVC에서 받아온 키워드 사용

 

1.2 내비게이션 바 title 제목을 목데이터에서 HomeView에서 받아온 제목으로 사용

 

detailVC

override func viewDidLoad() {
    super.viewDidLoad()
	self.title = reactor.title // 네비게이션 바 타이틀 설정
    
}

detailVC에서 네비게이션 바 타이틀을 homeVC에서 받아온 타이틀로 사용

 

 

1.3 시뮬레이터 확인