flatMap, compactMap

나이든별 / Oldstar·2022년 5월 29일
0

Think about Keywords

목록 보기
23/37

공부한 것

  • flatMap
  • compactMap

예시와 설명

  • 먼저 flattening 즉 평탄화에 대해 먼저 이야기해보자.
    • 배열의 차원 수를 줄여주는 것이다... 라고 한다.
    • 배열의 차원은 무엇인가? 배열이 중첩된 횟수를 말한다.
    • [[0, 1, 2], [3, 4, 5]]를 2차원 배열이라고 하는 것을 예로 들 수 있겠다. 배열 안에 배열이!
  • flatMap : 배열의 각 원소에 대해 클로저 안에서 정해진 처리를 한 다음, 처리된 값들의 배열을 반환한다.
  • 여기서 처리된 값들은, 배열의 각 원소의 원소이다.
func flatMap<SegmentOfResult>(_ transform: (Self.Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence
  • 천천히 뜯어보면, SegmentOfResult라는 제네릭을 사용한다. 그 안의 원소에 적합한 처리를 해서 반환하며, 이 과정에서 오류가 일어날 수 있다. SegmentOfResultSequence 프로토콜을 준수해야 한다.
  • Sequence 프로토콜은 간단히 말하면 원소에 순차적으로 접근할 수 있음을 나타내는 프로토콜이다. 0...3처럼 범위를 나타내는 것이 Sequence 프로토콜에 부합한다.
  • 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]

let flattened = mapped.flatMap { $0 }
// [1, 2, 2, 3, 3, 3, 4, 4, 4, 4]
  • compactMap : 배열의 각 원소에 대해 클로저 안에서 정해진 처리를 한 다음, 처리된 값들 중 nil이 아닌 것들의 배열을 반환한다.
  • Swift 4.1부터 사용 가능해진 함수. 이전에 flatMap이 쓰이던 용도 중 일부를 계승한다.
    • 이전에 flatMap은 세 가지 작업을 했다. 배열을 평탄화하고, nil을 제거하고, 옵셔널 바인딩하는 것.
    • 이 중 nil 제거 및 옵셔널 바인딩의 기능이 compactMap으로 이관되었다.
func compactMap<ElementOfResult>(_ transform: (Self.Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult]
  • 그렇기 때문에, 배열의 각 원소에 대해 처리하고 처리된 값들을 반환하는 map과 가장 많이 비교된다.
// 공식 문서에서 발췌

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]
  • 1차원 배열에서 사용할 때는, flatMapcompactMap이 같은 결과를 반환한다.

고민한 점 및 생각해본 점

  • 사실 compactMapflatMap과 가깝다고 생각했는데, 오히려 map과 더 가까운 인상을 받았다.
  • 개인적으로는 명확하게 역할이 구분된 새 함수를 써야 한다고 생각이 된다만, 기존에 써오던 방법대로의 flatMap을 고수하고자 하는 사람도 있을 것이다. 팀마다 다를 것이고, 어쨌든 작동은 되기 때문. 생각해볼 문제다.

참조

https://developer.apple.com/documentation/swift/sequence/2905332-flatmap
https://developer.apple.com/documentation/swift/sequence/2950916-compactmap
https://developer.apple.com/documentation/swift/sequence
https://jinshine.github.io/2018/12/14/Swift/22.%EA%B3%A0%EC%B0%A8%ED%95%A8%EC%88%98(2)%20-%20map,%20flatMap,%20compactMap/

profile
함께 나아가고자 하는 사람

0개의 댓글