Swift

map, compactMap, flatMap

Phililip
728x90

안녕하세요.

 

주로 Objective-C를 쓰다 보니... Swift의 compactMap과 flatMap이 자꾸 헷갈리더라구요..

 

글로 남겨두면 안 까먹겠지 싶어 map 삼총사 공부하고 정리해 보려고요ㅎㅎ

 


# map

Sequence의 elements들을 변환시킨 결과의 배열을 반환하는 함수.

 

시간복잡도는 O(n)입니다.

 

# compactMap

Sequence의 elements들을 변환시키고 nil이 아닌(=Optional이 아닌) 결과의 배열을 반환하는 함수.

(map 결괏값이랑 비교하면 어떤 차이인지 알겠죠?)

 

시간복잡도는 O(n)입니다.

 

# flatMap

Sequence의 elements들을 변환시키기고 single-level collection을 반환하는 함수.

 

여기서 single-level collection을 반환한다는 의미는, flatMap 클로저에서 sequence나 collection을 반환할 때, 이 sequence나 collection의 각 element들만 모아 하나의 배열로 반환한다는 뜻입니다.

 

시간복잡도는 O(n+m)입니다.

(여기서 n은 원본 sequence length이고, m은 결괏값의 length입니다.)

 

[참고] flatMap 클로저에서 optional 값을 반환하는 경우는 deprecated 되었으니 compactMap을 사용하세요.

flatMap 클로저에서 optional 값을 반환하는 경우, compactMap과 동일한 결괏값을 반환합니다. deprecated 되었으니 compactMap을 사용하면 좋을 것 같아요ㅎㅎ

 

# 정리

API 결괏값 시간복잡도
map elements를 변환시킨 배열 O(n)
(n: 원본 sequece의 length)
compactMap elements를 변환시킨 non-nil 배열 O(n)
(n: 원본 sequece의 length)
flatMap elements가 sequence나 collection로 변환될 경우, 내부 elements만 모은 하나의 배열을 반환 O(n+m)
(n: 원본 sequece의 length, m: 결괏값의 length)

 

# 참고

 

map(_:) | Apple Developer Documentation

Returns an array containing the results of mapping the given closure over the sequence’s elements.

developer.apple.com

 

compactMap(_:) | Apple Developer Documentation

Returns an array containing the non- results of calling the given transformation with each element of this sequence.

developer.apple.com

 

flatMap(_:) | Apple Developer Documentation

Returns an array containing the concatenated results of calling the given transformation with each element of this sequence.

developer.apple.com

 


이번 글은 여기서 마무리.

 

 

 

반응형