[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 } 형태로 작성하면 된다.