iOS/Swift

compactMap - 새로운 배열 생성

밤새는 탐험가89 2024. 9. 21. 06:50

 compactMap은 Swift의 배열이나 컬렉션에서 사용되는 고차 함수로, 클로저를 적용하여 nil이 아닌 값만 필터링하고, 동시에 값을 변환하여 새로운 배열을 반환하는 기능을 제공합니다.

 

 일반적인 map과 flatMap 함수와 달리, compactMap은 변환 과정에서 nil 값을 제거하는 역할을 합니다.

 

기본 문법

let resultArray = array.compactMap { element in
    // 변환 및 필터링 작업
}

 

 

compactMap 클로저 내부에서 nil을 반환하면 그 요소는 새로운 배열에서 제외되고, nil이 아닌 값만 결과 배열에 포함됩니다.

 

사용 예시

1. Int 문자열 배열을 정수로 변환

 숫자로 변환 가능한 문자열만 남기고 nil 값은 제거합니다.

let stringArray = ["1", "2", "three", "4", "five"]

let intArray = stringArray.compactMap { Int($0) }

print(intArray)  // 출력: [1, 2, 4]

 

"three"와 "five"는 Int로 변환할 수 없으므로 nil이 되고, 결과 배열에서 제외됩니다.

 

🟧 그럼 반대로 "three", "five"만 출력한다면?

let stringArray = ["1", "2", "three", "4", "five"]

let nonIntArray = stringArray.compactMap { Int($0) == nil ? $0 : nil }

print(nonIntArray)  // 출력: ["three", "five"]

 

2. 옵셔널 값을 포함하는 배열에서 nil 제거

옵셔널 값을 포함하는 배열에서 nil을 제거하고, 언래핑된 값을 새로운 배열에 넣습니다.

let optionalArray: [Int?] = [1, 2, nil, 4, nil, 5]

let compactedArray = optionalArray.compactMap { $0 }

print(compactedArray)  // 출력: [1, 2, 4, 5]

 

  • nil 값을 모두 제거하고 Int 값만 남긴 배열이 반환됩니다.

 

3. 복잡한 변환 및 필터링

compactMap을 사용하여 복잡한 변환 작업을 할 수 있습니다.

let numbers = [1, 2, 3, 4, 5]

let result = numbers.compactMap { $0 % 2 == 0 ? "\($0) is even" : nil }

print(result)  // 출력: ["2 is even", "4 is even"]

 

  • 여기서는 짝수일 때만 해당 숫자를 문자열로 변환하고, 홀수일 때는 nil을 반환하여 제외합니다.

결론

  • map: 모든 요소를 변환하며, nil 값도 포함될 수 있음.
  • compactMap: 변환하면서 nil 값을 제거함.
  • 용도: 옵셔널 배열에서 nil을 제거하거나, 변환 작업 중에 nil을 안전하게 제외하고 싶을 때 사용.