Project/HiddenGem

🤔 고차함수를 통해 외부에서 받아온 데이터에 문구를 추가하는 방법

밤새는 탐험가89 2025. 5. 15. 14:12

 

✅ 현재 화면에서 보이는 카테고리 부분에 추가 문구를 담는 방법 

API를 통해 카테고리를 정보를 받아옴

📋 카테고리 목록:
- 한식
- 서양식
- 일식
- 중식
- 이색음식점
- 카페/전통찻집
- 클럽

 

위의 문구에 App Store에서 처럼 이모지를 추가하여 UI 구현하려고 함

 

 

✅ 해결 방법 

원본 카테고리에 추가로 이모지를 합친 새로운 배열 생성 

 

📍 "이모지"와 "카테고리" 담을 데이터 모델 생성

/// 이모지를 폼할할 새 모델
struct CategoryEmogi: Hashable {
    let id = UUID()
    let name: String
    let icon: String
    
    var displayName: String {
        return "\(icon) \(name)"
    }
}

 

📍 각 카테고리 별로 이모지를 정할 메서드 선언

func updateCategories() {
    let emojiMap: [String: String] = [
        "한식": "🍚",
        "서양식": "🥩",
        "일식": "🍣",
        "중식": "🍜",
        "이색음식점": "🍤",
        "카페/전통찻집": "☕️",
        "클럽": "🎧"
    ]

    var newCategories: [CategoryEmogi] = []

    for category in categories {
        let name = category.name
        let icon = emojiMap[name] ?? "🥄"
        let categoryEmogi = CategoryEmogi(name: name, icon: icon)
        newCategories.append(categoryEmogi)
    }

    self.emojiCategories = newCategories
}

 

 

❓ 만약에 카테고리를 받아올 때 중복이 발생한다면?

func updateCategories() {
    let emojiMap: [String: String] = [
        "한식": "🍚",
        "서양식": "🥩",
        "일식": "🍣",
        "중식": "🍜",
        "이색음식점": "🍤",
        "카페/전통찻집": "☕️",
        "클럽": "🎧"
    ]

    var seen = Set<String>()               // 중복 제거용
    var orderedUniqueCategories: [String] = [] // 순서를 유지한 이름 배열

    // 1. 중복을 제거하면서 순서를 유지한 카테고리 이름 배열 생성
    for category in categories {
        let name = category.name
        if !seen.contains(name) {
            seen.insert(name)
            orderedUniqueCategories.append(name)
        }
    }

    // 2. 이모지를 붙여 CategoryEmogi 배열 생성
    var result: [CategoryEmogi] = []
    for categoryName in orderedUniqueCategories {
        let icon = emojiMap[categoryName] ?? "🥄"
        let emojiCategory = CategoryEmogi(name: categoryName, icon: icon)
        result.append(emojiCategory)
    }

    // 3. 최종 저장
    self.emojiCategories = result
}

 

 

✅ 고차함수를 통해 좀 더 축약해본다면?

func updateCategories(){

    let emojiMap: [String: String] = [
        "한식": "🍚",
        "서양식": "🥩",
        "일식": "🍣",
        "중식": "🍜",
        "이색음식점": "🍤",
        "카페/전통찻집": "☕️",
        "클럽": "🎧"
    ]

    self.emojiCategories = categories.map { category in
        let name = category.name
        let icon = emojiMap[name] ?? "🍽️"
        return CategoryEmogi(name: name, icon: icon)
    }
}