Swift

Swift - 고차함수 (compactMap, flatMap)

iosos 2023. 7. 12. 21:50

compactMap

- 컬렉션의 각 요소를 변환하고, 변환된 결과 중에서 'nil' 이 아닌 값들로 구성된 새로운 컬렉션을 만듦

- 변환 과정에서 옵셔널 값을 처리 -> 옵셔널 바인딩 기능을 가짐 (옵셔널 제거)

- 반환 된 값이 'nil' 이 아닌 경우에만 최종 컬렉션에 포함 

 

 

 

기본 형식

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

- Element : 컨테이너 요소 타입 

- ElementOfResult : 변환 후 타입 

- transform : 클로저로, 컨테이너의 각 요소에 대해 실행되는 변환 작업을 정의. 옵셔널 값을 반환 (ElementOfResult?)

 

 

 

 

compactMap 함수를 사용하여 배열에서 숫자 문자열을 정수로 변환하는 예

// compactMap 함수
let stringNumbers = ["1", "2", "3", "four", "5"]
let numbers = stringNumbers.compactMap { Int($0) }
print(numbers) // 출력: [1, 2, 3, 5]

- stringNumbers 배열의 각 요소에 대해 Int($0) 변환을 시도 

- 변환 결과가 옵셔널인 경우 ("four"), 해당 요소 제외 

 

 

 

map 함수와 비교

// map 함수
let stringNumbers = ["1", "2", "3", "four", "5"]
let mapNumbers = stringNumbers.map { Int($0) }
print(mapNumbers) // 출력: [Optional(1), Optional(2), Optional(3), nil, Optional(5)]

- map을 사용하면 Optional 값이지만, compactMap은 Int에 해당하는 값만 들어있음

→ compactMap은 옵셔널 바인딩 기능을 가지기 때문

 

 

 

 

 

 

 

 


flatMap

- 컨테이너의 각 요소에 대해 변환을 적용하고, 변환 결과를 평면화(Flatten)하여 단일 컨테이너로 반환

- 주로 2차원 이상의 중첩된 컨테이너를 평면화하는 데에 사용 

 

 

 

기본 형식

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

- Element : 컨테이너 요소 타입 

- SegmentOfResult : 변환 후의 컨테이너 타입 

- transform : 클로저로, 컨테이너의 각 요소에 대해 실행되는 변환 작업 정의 

- 변환된 값은 SegmentOfResult 형태로 반환됨 

- [SegmentOfResult.Element] where SegmentOfResult : Sequence → SegmentOfResult가 Sequence 프로토콜을 준수하는 경우, 변환 결과인 SegmentOfResult의 요소들을 배열로 평면화하여 반환 

 

 

 

 

중첩된 3차원 배열을 평면화하는 예제 

// flatMap 함수
let nestedArray = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
let flattenedArray = nestedArray.flatMap { $0 }
print(flattenedArray) // 출력 : [[1, 2], [3, 4], [5, 6], [7, 8]]


let doubleFalttenArray = flattenedArray.flatMap{$0}
print(doubleFalttenArray) // 출력: [1, 2, 3, 4, 5, 6, 7, 8]


let flattenMap = nestedArray.flatMap{ $0.flatMap{ $0 }}
print(flattenMap)  // 출력: [1, 2, 3, 4, 5, 6, 7, 8]

- nestedArray. : 3차원 배열 

- flattenedArray : 3차원 함수를 가져와 2차원 배열로 변환 

 

- 2차원 배열로 변환된 flattenedArray에 flatMap을 한 번 더 적용하면 1차원 배열로 변환 

 

- flattenMap : flatMap 함수를 한 번에 적용하여 3차원 배열을 평면화

 

 

 

 


참고 )

 

https://jinshine.github.io/2018/12/14/Swift/22.%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98(2)%20-%20map,%20flatMap,%20compactMap/ 

 

[Swift] 고차함수(2) - map, flatMap, compactMap - jinShine

map map은 배열 내부의 값을 하나씩 mapping한다고 생각하면 쉽게 다가올껍니다. 각 요소에 대한 값을 변경하고자 할때 사용하고, 그 결과들을 배열의 상태로 반환합니다. Declaration 1func map (_ transform:

jinshine.github.io

 

https://velog.io/@un1945/Swift-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-compactMap-flatMap

 

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

안녕하세요! Kio입니다 👻지난 번 \[Swift] 고차함수 (map, filter, reduce) 포스팅에서map, filter, reduce 에 대해 다뤘었는데요.오늘은 추가적으로 그 외의 고차함수인 compactMap 과 flatMap 에 대해 알아보려

velog.io