모바일 앱 개발

[Swift] 고차함수 map, flatMap, compactMap

하나공신 2021. 8. 26. 16:37

개요

화면에 표시해줄 데이터는 보통 서버에서 컬렉션 형태로 내려옵니다.

이런 컬렉션 타입내 각각의 값에 필요한 작업을 적용하기 위해 고차함수인 Map을 주로 사용하는데

Swift에서 제공하는 map의 종류가 3가지라서 종종 헷갈립니다.

이번에 확실하게 정리 해봅니다.


map

다른 언어세도 통용되는 map과 같은 개념으로,

배열과 같은 콜렉션 타입의 각 요소에 접근해서 원하는 작업을 수행한 결과를 다시 반환합니다.

let arrayOfIntegers = [1, 2, 3, 4]

let arrayOfStrings = arrayOfIntegers.map { String($0) }

print(arrayOfStrings) 

// Prints ["1", "2", "3", "4"]

 


compactMap

Swift는 다른 언어에 잘 없는 Optional 이라는 개념이 있는데요.

comactMap은 map과 유사하지만 컬렉션 내에서 nil(null)에 해당하는 값은 자동으로 제거한 결과를 반환합니다.

Optional한 데이터를 처리하는데 유용합니다.

let arrayOfIntegers = [1, 2, nil, 4]

let arrayOfStrings = arrayOfIntegers.compactMap { optionalInteger -> String? in
    guard let integer = optionalInteger else { return nil }
    return String(integer)
}

print(arrayOfStrings)

// Prints ["1", "2", "4"]

 


flatMap

compact Map을 이해했다면, flatMap도 쉽게 이해할 수 있습니다.

flatMap도 동일하게 컬렉션내에서 nil을 제거한 값을 반환합니다.

 

하지만 다른 점이 하나있는데요.

"Flat" 이라는 말처럼 2차원 배열을 1차원으로 Flat하게 만들어서 반환해주는 역할도 합니다.

그렇기 때문에 아래와 같은 복잡한 배열(2차원)에서 자주 사용됩니다.

let arrayOfIntegers = [[1, 3, 5, nil], [2, nil, 6]]

let arrayOfStrings = arrayOfIntegers.flatMap { $0 }.compactMap { $0 }

print(arrayOfStrings)

// Prints [1, 3, 5, 2, 6]

flatMap으로 먼저 배열을 1차원으로 만들고 -> compactMap을 이용해서 nil 값들을 없앨 수 있습니다.


레퍼런스

https://betterprogramming.pub/map-vs-flatmap-vs-compactmap-c75f66b904a6