앞서 [Swift] 고차함수 - map, filter, reduce 에서 map에 대해 정리했지만,
오늘은 flatMap, compactMap을 함께 비교하며 다시 정리해보려 한다. ( 참고 : tdcian님 블로그 )
[Swift] 고차함수 - map, filter, reduce
주제: Swift 표준 라이브러리에서 제공하는 고차함수 map, filter, reduce (참고: yagom's blog, 개발하는 훈이님 블로그 ) 📌 고차함수란? 고차함수(Higher-order function)는 다른 함수를 *전달인자로 받거나, 함
yurim-dev.tistory.com
1️⃣ map(_:)
📌 개요
기능 : 클로저를 시퀀스의 각 요소에 적용시켜 새로운 array를 생성한다.
* mapping(맵핑): 맵핑(mapping)은 함수나 클로저를 콜렉션(ex: array, sequence)의 원소에 적용하여 새로운 콜렉션을 만드는 과정을 뜻한다.
* closure(클로저): 클로저는 컨테이너 내부에 들어있는 요소들의 값을 어떻게 바꿀 것인지 결정한다.
매개변수(parameter)를 받아 값을 반환할 수 있는 자체 코드블록이며, 함수와 비슷하지만 별도의 이름 없이 인라인으로 정의할 수 있다.
* sequence(시퀀스): 시퀀스는 반복할 수 있는 일련의 값을 나타내는 타입이다. 배열(Arrays), 집합(sets), 범위(ranges)가 그 예이다.
📌 포인트 (2D array⭕ , nil⭕ )
1. 2차원 배열(2D array) 반환
아래 예시처럼 결과값으로 배열을 return하는 클로저일 경우,
원본 원소가 배열로 변환되면서 배열이 중첩되고, 2차원 배열을 반환한다.
let numbers = [1, 2, 3, 4]
let mappedResult = numbers.map { [$0, $0 * 2] }
// mappedResult is now [[1, 2], [2, 4], [3, 6], [4, 8]]
2. nil을 그대로 출력한다.
결과값이 옵셔널일 경우, nil값도 포함하여 반환한다.
let strings = ["1", "2", "three", "4", "five"]
let mappedResult = strings.map { Int($0) }
// mappedResult is now [1, 2, nil, 4, nil]
2️⃣ flatMap(_:)
📌 개요
기능 : map과 유사하지만, 1) 연속된 하나의 결과(concatenated results)를 반환한다는 점, 2) nil 값은 제외하고 반환한다는 점에서 다르다.
1)을 쉽게 말하면 항상 1차원 배열을 반환한다고 할 수 있다.
📌 포인트 (2D array ❌ , nil ❌ )
1. 1차원 배열(1D array) 반환
아래 예시처럼 결과값으로 배열을 return하는 클로저일 경우,
원본 원소가 배열로 변환되면서 배열이 중첩되지만, "flatten"하여 1차원 배열을 반환한다.
let numbers = [1, 2, 3, 4]
let flatMappedResult = numbers.flatMap { [$0, $0 * 2] }
// flatMappedResult is now [1, 2, 2, 4, 3, 6, 4, 8]
2. nil 값은 자동적으로 필터링되어 빠진다. (*nil ≒ null)
결과값이 옵셔널일 경우, nil값은 자동적으로 빠진다.
let strings = ["1", "2", "three", "4", "five"]
let flatMappedResult = strings.flatMap { Int($0) }
// flatMappedResult is now [1, 2, 4]
3️⃣ compactMap(_:)
📌 개요
기능 : map과 유사하지만, nil 값은 제외하고 반환한다.
📌 포인트 (2D array⭕ , nil ❌ )
1. 2차원 배열(2D array) 반환
아래 예시처럼 결과값으로 배열을 return하는 클로저일 경우,
원본 원소가 배열로 변환되면서 배열이 중첩되고, 2차원 배열을 반환한다.
let numbers = [1, 2, 3, 4]
let mappedResult = numbers.compactmap { [$0, $0 * 2] }
// mappedResult is now [[1, 2], [2, 4], [3, 6], [4, 8]]
2. nil 값은 자동적으로 필터링되어 빠진다. (*nil ≒ null)
결과값이 옵셔널일 경우, nil값은 자동적으로 빠진다.
let strings = ["1", "2", "three", "4", "five"]
let flatMappedResult = strings.compactMap { Int($0) }
// flatMappedResult is now [1, 2, 4]
🟦 요약
1. 2D array 반환 여부
let numbers = [1, 2, 3, 4]
클로저 | 결과 |
numbers.Map { [$0, $0*2] } | [[1, 2], [2, 4], [3, 6], [4, 8]] |
numbers.flatMap { [$0, $0*2] } | [1, 2, 2, 4, 3, 6, 4, 8] |
numbers.compactMap { [$0, $0*2] } | [[1, 2], [2, 4], [3, 6], [4, 8]] |
2. nil 값 포함 여부
let strings = ["1", "2", "three", "4", "five"]
클로저 | 결과 |
strings.Map { Int($0) } | [1, 2, nil, 4, nil] |
strings.flatMap { Int($0) } | [1, 2, 4] |
strings.compactMap { Int($0) } | [1, 2, 4] |
'Swift > 문법' 카테고리의 다른 글
[Swift] 연산자 (operator) - arithmetic, overloading, compound, comparison (0) | 2024.02.16 |
---|---|
[Swift] 옵셔널(Optional) 제거 방법 3가지 (0) | 2024.02.15 |
[Swift] Character를 Int로 변환하기 - .wholeNumberValue, hexDigitValue, Int(String(문자)) (0) | 2024.02.07 |
[Swift] 고차함수 - map, filter, reduce (2) | 2024.02.07 |
[Swift] if...else 구문 대신 사용 가능한 Ternary Conditional Operator (삼항 연산자) (0) | 2024.02.07 |