[Swift] flatMap? compactMap?

4~5년 전부터 개발하고 있는 앱이 점점 레거시 코드가 너무 많아져서 Warning이 300~400개가 넘어가고 있다. 개발하면서 여유가 없어서 레거시 코드를 개선할 생각이 없었는데 이번에 시간이 좀 여유가 생기면서 마음먹고 개선을 하는 도중 flatMap와 compactMap 관련으로 워닝이 뜨고 있길래 간단하게 글을 써볼려고 한다.

🤔 flatMap이랑 compactMap이 뭐에요?

flatMap은 다른 언어에서 자주 들어보았는데 compactMap은 처음 들어봤다. 아, 물론 compactMap은 Swift에서만 있는 고차함수다. 원래는 flatMap 만 있었다가 Apple이 추가하였다.

flatMap은 배열을 평탄화 시켜주는 함수고 compactMap은 nil이 아닌 데이터들을 다시 뱉어준다고 한다. 어?? 근데 flatMap도 가능한데??

👀 flatMap 쓰면 안되나요?

써도 된다. 근데 Xcode에서 Warning을 뱉는다. 그것도 특정한 상황에서만. 그 특정한 상황은 배열에 nil이 포함되어있을때 Warning을 뱉는다.

nil이 포함되어있지 않으면 Warning도 나오지 않고 원하는 동작(배열 평탄화)이 정상적으로 나올테니 그냥 쓰면 된다. 평탄화 시키지 않고 단순히 배열내의 nil을 다 없애버리고 싶을 때 compactMap을 사용하면 된다.

🛠 실전형 예시

저렇게 일차원 배열은 평탄화를 진행해도 일차원이기 때문에 평탄화를 할 필요가 없다. 단순히 nil 값을 없애버리고 싶다면 Xcode에서 compactMap으로 변환하라고 하는 것이다. compactMap으로 바꿔보자

워닝도 안뜨고 원하는 결과가 잘 나왔다.

이차원 배열을 평탄화하면서 nil이 아닌 값을 뱉게 할거면 .flatMap { $0 }.compactMap{ $0 } 형태로 작성하면 된다.