Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

teunteun2

[Swift] 고차함수 정리(1) - Map, FlatMap, CompactMap, Filter, ForEach 본문

iOS

[Swift] 고차함수 정리(1) - Map, FlatMap, CompactMap, Filter, ForEach

teunteun2 2023. 4. 23. 16:59

고차함수란

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 한다.