[TIL / 25.03.17] Array.compactMap (feat. 문법 심화 과제)

2025. 3. 17. 16:09·iOS/Swift

문제에서 요구사항이 "함수 c 에 Numbers 프로토콜 요소를 가진 배열만 사용할 수 있는 함수 d 를 작성해주세요."였다.

 

엥? 배열 내 요소에 프로토콜 준수를 시킨다는건 대충 알겠지만 뭐 어떤 내용에 대한 준수를 하도록 할 것이며... 등등 의문이 좀 있었는데 어쨋든 구현을 해보기로 한다.

 

import Foundation

protocol Numbers {
    var intValue: Int? { get }
}

class ThirdQuestion {
    
    func removeEvenNum(_ array: [Int]) -> [Int] {
        var result: [Int] = []
        
        for i in 1...array.count {
            // 홀수 요소를 따로 빼도록 하여 기존 요소 중 짝수만 없도록 처리
            if i % 2 != 0 {
                result.append(array[i-1])
            }
        }
        
        return result
    }
    
    func removeEvenString(_ array: [String]) -> [String] {
        var result: [String] = []
        
        for i in 1...array.count {
            if i % 2 != 0 {
                result.append(array[i-1])
            }
        }
        
        return result
    }
    
    // 위 함수들을 제네릭을 이용해 타입을 유연하게 하여 하나의 함수로 대체
    func removeEven<T> (_ array: [T]) -> [T] {
        var result: [T] = []
        
        for i in 1...array.count {
            if i % 2 != 0 {
                result.append(array[i-1])
            }
        }
        
        return result
    }
    
    func removeEvenWithNumbers<T: Numbers> (_ array: [T]) -> [T] {
        let result = array.enumerated().compactMap { (index, element) in
            return index % 2 == 0 ? element : nil
        }
        
        return result
    }
    
    func printNumbers(numbers: [Numbers]) {
        let values = numbers.compactMap { $0.intValue }
        
        print(values)
    }
    
}

struct Number<T>: Numbers {
    
    var num: T?
    
    var intValue: Int? {
        if let doubleValue = num as? Double {
            return Int(doubleValue)
        } else if let floatValue = num as? Float {
            return Int(floatValue)
        } else if let intValue = num as? Int {
            return intValue
        }
        return nil
    }
    
}

 

대충 수정 전 코드다. (계속 리팩토링 해가면서 단계별로 커밋해 히스토리화할 예정)

 

let firstExample: [Number] = [
    Number(num: 1),
    Number(num: 3.5),
    Number(num: 7),
    Number(num: 6.6),
    Number(num: 10.4),
    Number(num: 3.14),
]

let filteredNumbers = thirdQuestion.removeEvenWithNumbers(firstExample)
print(filteredNumbers

 

이를 여기서 가져다가 썼는데,,,,

 

intValue 연산 당시 옵셔널로 리턴해주기 때문에 이를 풀어줘야 했음,,

이럴 때 쓰는 함수..! compactMap.

 

https://tdcian.tistory.com/305

 

에.. 짤이 웃겨서 가져왔는데 ㅋㅋ 마지막 컷에 나오는 non-nil을 돌려주는 compactMap함수를 쓰도록 할것입니다.~

 

우선 저 안에 있는 num 값이 intValue로 들어가있을거라, 그 intValue 값들을 따로 모아야 함

 

func printNumbers(numbers: [Numbers]) {
        let values = numbers.compactMap { $0.intValue }
        
        print(values)
    }

 

해당 함수를 보면 numbers라는 이름의 배열로 추출하고자 하는 배열을 받도록 해서 각 요소의 intValue를 모아 values에 저장하도록 함

그렇게 values를 print하도록 해 추출된 intValue를 출력한다! 이거임

 

해당 함수가 생겼으니.. 이를 써야 제대로된 로그를 띄울 수 있다

 

let firstExample: [Number] = [
    Number(num: 1),
    Number(num: 3.5),
    Number(num: 7),
    Number(num: 6.6),
    Number(num: 10.4),
    Number(num: 3.14),
]

let filteredNumbers = thirdQuestion.removeEvenWithNumbers(firstExample)
thirdQuestion.printNumbers(numbers: filteredNumbers)

 

아까 그 파트를 조금 수정해서 printNumbers를 처리하도록 함

그럼 결국 firstExample에 들어간 숫자들은 Int부터 Double까지 있는데 해당 값들을 removeEvenWithNumbers에서 인덱스에 따라 짝수 요소들을 빼주고 새롭게 나온 배열을 compactMap을 이용해 non-nil 처리 후 print하도록 함

 


코드 블럭 기본 세팅이 너무 보이지 않게 되어있어서 빨리 바꿀 필요가 있다....

'iOS > Swift' 카테고리의 다른 글

[TIL / 25.03.19] playground, command line tool에서의 비동기 함수 (feat. escaping closure)  (2) 2025.03.19
[TIL / 25.03.18] 최적화(OptimizationTips) 1  (5) 2025.03.18
[TIL / 25.03.13] 의존성 주입 (Dependency Injection)  (0) 2025.03.13
[TIL / 25.03.12] Alamofire Interceptor에 관한 문제 해결  (0) 2025.03.12
[TIL / 25.03.11] 에러 핸들링(Error Handling)  (2) 2025.03.11
'iOS/Swift' 카테고리의 다른 글
  • [TIL / 25.03.19] playground, command line tool에서의 비동기 함수 (feat. escaping closure)
  • [TIL / 25.03.18] 최적화(OptimizationTips) 1
  • [TIL / 25.03.13] 의존성 주입 (Dependency Injection)
  • [TIL / 25.03.12] Alamofire Interceptor에 관한 문제 해결
subkyu-ios
subkyu-ios
subkyu-ios 님의 블로그 입니다.
  • subkyu-ios
    subkyu-ios 님의 블로그
    subkyu-ios
  • 전체
    오늘
    어제
    • 분류 전체보기 (48) N
      • iOS (32) N
        • Swift (32) N
      • 내일배움캠프 (7)
      • Git, Github (3)
      • Algorithm (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    사전캠프
    TableView
    stackview
    트러블슈팅
    프로그래머스
    Swift
    최적화
    UIKit
    회고
    알고리즘
    tabman
    본캠프
    협업
    ios
    algorithm
    내일배움캠프
    KPT
    github
    til
    Wil
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
subkyu-ios
[TIL / 25.03.17] Array.compactMap (feat. 문법 심화 과제)
상단으로

티스토리툴바