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://velog.io/@un1945/Swift-%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98-compactMap-flatMap
'Swift' 카테고리의 다른 글
Swift - 비동기처리(async / await) (0) | 2023.07.14 |
---|---|
Swift - sort, sorted 함수 비교 (0) | 2023.07.13 |
Swift - 고차함수 (map, filter, reduce) (0) | 2023.07.11 |
Swift - 의존성 주입(Dependency Injection) (0) | 2023.07.10 |
Swift - 문서화 (퀵헬프 표시 주석 작성 방법) (0) | 2023.07.09 |