[Swift] 고차함수 (compactMap, flatMap)

Kio·2022년 1월 25일
3

Swift

목록 보기
12/14

안녕하세요! Kio입니다 👻

지난 번 [Swift] 고차함수 (map, filter, reduce) 포스팅에서
map, filter, reduce 에 대해 다뤘었는데요.

오늘은 추가적으로 그 외의 고차함수인
compactMapflatMap 에 대해 알아보려 합니다.

Let's get started 🥰




compactMap

Returns an array containing the non-nil results of calling the given transformation with each element of this sequence.

컨테이너의 각 요소를 조건을 지정하여 호출할 때, nil 이 아닌 배열을 반환합니다.



선언 (Declaration)

Apple 에서는 compactMap 이 아래처럼 정의되어 있네요.

func compactMap<ElementOfResult>(_ transform: (Self.Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]



매개변수 (Parameters)

transform

  • transform 는 컨테이너의 요소를 매개변수로 받아 선택적 값을 반환하는 클로저입니다.



예시 (Discussion)

예시를 통해 compactMap 을 더 알아볼게요!
다음 예제는 같은 결과를 출력합니다.


map

let possibleNumbers = ["1", "2", "three", "///4///", "5"]

let mapped = possibleNumbers.map { str in Int(str) }
// [Optional(1), Optional(2), nil, nil, Optional(5)]

compactMap

let possibleNumbers = ["1", "2", "three", "///4///", "5"]

let compactMapped = possibleNumbers.compactMap { str in Int(str) }
// [1, 2, 5]

map 을 사용했을 때는 Optional 이지만
compactMap 을 사용하니 Int 에 해당하는 값만 들어갔네요? 👀

그 이유는 compactMap 이 옵셔널 바인딩의 기능을 가지고 있기 때문입니다.
map 의 원래 기능에서 옵셔널 제거까지 가능합니다.
map 보다 단순하고 가볍게 바꿀 수 있어서 compactMap 으로 짓지 않았나 싶네요 👻




flatMap

Returns an array containing the concatenated results of calling the given transformation with each element of this sequence.

컨테이너의 각 요소를 사용하여 지정된 조건을 호출할 때, 순차적인 결과의 배열을 반환합니다.

말이 너무 어려운데요 😭
쉽게 말하면 중첩된 배열을 제거하고 평평한 배열(flattened array)을 리턴합니다.


선언 (Declaration)

Apple 에서는 flatMap 은 아래처럼 정의되어 있네요.

func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence



매개변수 (Parameters)

transform

  • transform 는 컨테이너의 요소를 매개변수로 받아, 컨테이너로 반환하는 클로저입니다.



예시 (Discussion)

예시가 빠질 수 없겠죠?
전 예시 없이는 이해할 수 없습니다... 😱


예시1 (2차원 배열)

let numbers = [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]

let flatMapped = numbers.flatMap { $0 }
print(flatMapped)
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

flatMap 을 사용하니 2차원 배열이 1차원 배열이 되어
평평한 배열(flattened array) 을 리턴하였네요!


예시2 (3차원 배열)

let numbers = [[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]]

let flatMapped = numbers.flatMap { $0 }
print(flatMapped)
// [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]

let doubleFlatMapped = flatMapped.flatMap { $0 }
print(doubleFlatMapped)
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

3차원 배열도 flatMap 2번을 사용하니
평평한 배열(flattened array)이 되었습니다.


let numbers = [[[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]]

let flatMapped = numbers.flatMap { $0 }.flatMap { $0 }
print(flatMapped)
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

2번을 사용하고자 한다면
위처럼 .flatMap { $0 }.flatMap { $0 } 을 사용해도 됩니다!

이처럼 예시를 통해 알 수 있듯 flatMap 중첩된 배열을 제거합니다.
중첩이 많이 되어있다면 그 만큼 사용해보면 되겠죠? 🥳




마치면서

이렇게 compactMap, flatMap 에 대해 알아보았는데요!

map 으로도 할 수 있는 기능이지만
compactMap, flatMap 을 활용하면 쉽고 간편하게 사용할 수 있네요! 👻

compactMap, flatMap 의 뜻이 무엇인지
잘 생각하면 앞으로 활용을 좀 더 해볼 수 있을 것 같습니다 🥰




참고

compactMap - developer.apple
flatMap - developer.apple




잘못된 정보가 있으면 언제든 코멘트 부탁드립니다 👻

profile
Someday_iOS_Dev

0개의 댓글