teunteun2
[Swift] 고차함수 정리(1) - Map, FlatMap, CompactMap, Filter, ForEach 본문
고차함수란
A function that takes one or more functions as arguments or returns a function as its result.
함수를 인자로 가지거나 함수를 리턴하는 함수
Map
Sequence 요소에 대한 클로저 결과가 포함된 배열을 return
func map<T>(_ transform: (Self.Element) throws -> T) rethrows -> [T]
Parameters
transform -> Sequence의 요소를 매개변수로 가지는 클로저,
같거나 다른 Type의 변환된 값을 return 한다
Return Value
transform 클로저를 통해 변환된 요소들을 담은 array가 return 된다
정리
클로저를 통해 같거나 다른 Type을 가진 array가 리턴될 수 있다
기존 Array 변경이 아닌, 클로저를 통해 리턴된 값들을 새로운 Array에 담아 return 한다
Flat Map
해당 Seuqunce 각 요소의 변환으로 생겨난 배열들을 concat (한 배열로 합침) 한 배열을 return
func flatMap<SegmentOfResult>(
_ transform: (Self.Element) throws -> SegmentOfResult
) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
Parameters
transform -> Sequence의 요소를 매개변수로 가지는 클로저,
sequence 혹은 collection을 반환한다
Return Value
transform 클로저를 통해 변환된 array들을 flattened 한 array가 return 된다
Map 과 FlatMap 의 차이
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]
정리
s.flatMap(transform)
Array(s.map(transform).joined())
// 둘 같음
Complexity
복잡도는 O(m+n)
n : sequence 의 길이
m : result의 길이
CompactMap
해당 Seuqunce 각 요소의 변환의 결과값이 non-nil인 것만 return
func compactMap<ElementOfResult>(
_ transform: (Self.Element) throws -> ElementOfResult?
) rethrows -> [ElementOfResult]
Parameters
transform -> Sequence의 요소를 매개변수로 가지는 클로저,
optional value를 반환한다
Return Value
transform 클로저를 통해 변환된 옵셔널 value들중 non-nil 값만 담은 array가 return 된다
Map과 CompactMap 차이
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]
Complexity
O(n), n은 sequence의 길이다
Filter
해당 Seuqunce 각 요소의 조건 결과가 true인 것만 return
func filter(
_ isIncluded: (Self.Element) throws -> Bool
) rethrows -> [Self.Element]
Parameters
isIncluded -> Sequene의 요소의 조건 충족 판단을 위한 클로저
Example
다 똑같음
let array = [1,2,3,4]
let oddNumArray = array.filter { $0 % 2 == 1 }
let oddNumArray = array.filter { return $0 % 2 == 1 }
let oddNumArray = array.filter { num -> Bool in
return num % 2 == 1
}
let oddNumArray = array.filter { num in
return num % 2 == 1
}
let oddNumArray = array.filter { num in
num % 2 == 1
}
For-Each
해당 Seuqunce 각 요소를 한바퀴 도는 Void 메서드
func forEach(_ body: (Self.Element) throws -> Void) rethrows
Parameters
body -> Sequene의 요소를 매개변수로 가지는 클로저
forEach 메서드와 for-in loop의 차이점
1. body 클로저가 실행되는 동안 break 혹은 continue를 사용하지 못한다
2. body가 return 되는 방법은 외부에서 관여 못함
1,2 모두 subsequent 스킵을 못한다는 공통점을 가지고 있다.
정리
Sequence의 모든 요소를 한바퀴 돌고 Void를 return 한다.
'iOS' 카테고리의 다른 글
WWDC23 - Add SharePlay to your app (0) | 2023.06.07 |
---|---|
[XCode] Hous-의 UIComponent SPM 모듈화 (1) - WWDC19 Creating Swift Packages (0) | 2023.05.20 |
[Xcode] SwiftGen 적용하기 (0) | 2022.09.07 |
[Swift] 키보드에 맞춰 ScrollView Content Inset 변경하기 (0) | 2022.05.21 |
[Swift] ReactorKit (0) | 2022.05.10 |