728x90
반응형
SMALL
반응형
map
map 은 이미 너무 많이 알다시피 forEach와 같은 기능을 합니다
let arr = [1,2,3,4,5]
arr.map { print($0, terminator: " ") }
// 1 2 3 4 5
flatMap
[정의]
func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
transform 파라미터에 self의 요소를 인자로 받아서 각 시퀀스요소의 변환을 한 다음 array를 리턴한다고 하네요.
[ 쓰임 ]
Apple 문서에서도 잘 나와 있지만 Flatmap은 다음 두 가지 역할을 합니다.
1. flatten하게 만들어줌
2.nil을 제거
3. 옵셔널 바인딩
1차원 배열에서
let array1 = [1, nil, 3, nil, 5, 6, 7]
let flattenedMap = array1.flatMap{ $0 }
print("flattenedMap :", flattenedMap)
// flattenedMap : [1, 3, 5, 6, 7]
또는 아래처럼 클로저 안에 반환할 요소의 형태를 지정해서 사용할 수도 있습니다.
let numbers = [1, 2, 3, 4]
let mapped = numbers.map { Array(repeating: $0, count: $0) }
// [[1], [2, 2], [3, 3, 3], [4, 4, 4, 4]]
let flatMapped = numbers.flatMap { Array(repeating: $0, count: $0) }
// [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
친절하게 시간복잡도에 대해서도 써 있었습니다..
O(m + n), where n is the length of this sequence and m is the length of the result.
시간복잡도는 O(m+n)이고, n은 배열 길이, m은 결과의 길이라고 합니다.
2 차원 배열에서
let array2: [[Int?]] = [[1, 2, 3], [nil, 5], [6, nil], [nil, nil]]
let flatMapArr = array2.flatMap { $0 }
print("flatMapArr :",flatMflatMapArrapTest2)
// flatMapArr : [Optional(1), Optional(2), Optional(3), nil, Optional(5), Optional(6), nil, nil, nil]
2차원 배열에서 flatMap 사용 시 다음과 같습니다.
1. 1차원 배열로 미분
2. nil은 제거하지 않는다.
compactMap
compactMap은 foundation 과 combine에서의 사용이 비슷하지만 달라서 이 내용은 나중에 다시 다뤄봐야겠습니다.
func compactMap<ElementOfResult>(_ transform: ((T.Value?, U.Value?, Range<AttributedString.Index>)) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
[쓰임]
1차원 배열에서는 flatMap 과 같은 기능을 합니다!
let array1 = [1, nil, 3, nil, 5, 6, 7]
let compactMappedArr = array1.compactMap { $0 }
print("compactMappedArr :", compactMappedArr)
// compactMappedArr : [1, 3, 5, 6, 7]
문서의 예제
let possibleNumbers = ["1", "2", "three", "///4///", "5"]
let mapped: [Int?] = possibleNumbers.map { str in Int(str) }
// [1, 2, nil, nil, 5]
let compactMapped: [Int] = possibleNumbers.compactMap { str in Int(str) }
// [1, 2, 5]
2차원 배열에서는 조금 다릅니다!
let array2: [[Int?]] = [[1, 2, 3], [nil, 5], [6, nil], [nil, nil]]
let compactMappedArr = array2.compactMap { $0 }
print("compactMappedArr :",compactMappedArr)
// compactMappedArr : [[Optional(1), Optional(2), Optional(3)], [nil, Optional(5)], [Optional(6), nil], [nil, nil]]
1. flatMap 과 마찬가지로 nil을 제거하지는 않습니다.
2. 그러나 flatMap과 다르게 2차원 배열을 1차원으로 변환하지 않습니다.
O(n), where n is the length of this sequence.
n은 배열의 길이고 시간 복잡도는 O(n)이라고 합니다
정리하자면,
- 1차원 배열에서 nil 제거 및 옵셔널 바인딩이 필요하다면 flatMap 과 compactMap 을 사용한다
- 2차원 배열에서 1차원 배열로의 변형이 필요할 때는 flatMap을 사용한다!
입니다.
참고
- JinShine의 블로그 - [Swift] 고차함수(2) - map, flatMap, compactMap
- 애플 공식문서
728x90
반응형
LIST
'Swift' 카테고리의 다른 글
[Swift/iOS] tagView, ChipView를 만들어보자! (0) | 2024.05.15 |
---|---|
[Swift / iOS ] 디자인 패턴 (MVVM, MVP, MVI에 대한 모든 것 ) - Hyeon's iOS 개발 (0) | 2023.12.14 |
[Swift] ClosedRange (1) | 2023.10.23 |
[Swift]iOS 17 업데이트로 인한 Apple의 URL Parsing 변경 이슈 (1) | 2023.10.06 |
[Swift] 라이노 님의 FileIO 코드 분석하기 (0) | 2023.10.03 |