[Swift] - map 삼형제(map, compactMap, flatMap)

longlivedrgn·2023년 1월 22일
0

swift문법

목록 보기
35/36
post-thumbnail

map

  • 아래와 같이 각 요소에 대한 값을 변경할 때 사용이 된다.
  • 배열의 형태로 반환이된다.
func map<T>(_ transform: (String) throws -> T) rethrows -> [T]

[Swift] - 고차함수(Map,Filter,Reduce), allSatisfy, forEach

compactMap

  • map을 해주는 동시에 nil을 제거하고 옵셔널 바인딩을 해준다.
func compactMap<ElementOfResult>(_ transform: (Int?) throws -> ElementOfResult?) rethrows -> [ElementOfResult]

flatMap

  • map을 해주는 동시에 nil을 제거하고 옵셔널 바인딩을 해준다.
  • 중첩된 배열을 제거한다.
  • 1차원 배열로 flatten하게 해준다.
func flatMap<SegmentOfResult>(_ transform: ([Int]) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Element] where SegmentOfResult : Sequence

compactMap vs flatMap

  • compactMap
let possibleNumbers = ["0", "2", "three", "사", "5"]

let compactMapped = possibleNumbers.compactMap { str in Int(str) }
// [0, 2, 5]
  • flatMap
let notYetFlatMapped = [[1], [2, 3], [4, 5, 6], [7, 8, 9, 10]]

let flatMapped = notYetFlatMapped.flatMap { $0 }
print(flatMapped)
// [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

map VS compactMap

  • 아래의 경우에는 map을 쓰던 compactMap을 쓰던 상관이 없다.
  • 어떠한 자료형을 String으로 바꾸는 것은 그냥 “ “을 붙히면 되기에 optional이 될 수가 없다.
  • 따라서 그냥 map으로 구현이 가능하다.
let operators = Operator.allCases.map { String($0.rawValue) }
  • 그러나, 아래의 케이스는 compactMap만 사용이 가능하다.
  • String과 다르게 Double을 만들어주는 경우, 모든 자료형을 Double로 만들 수는 없기 때문이다.
    • ex) Double(“Miro”) ⇒ 불가능
    • ex) String(1) ⇒ 가능
let operandsList = operandElements.compactMap { Double($0) }

📚 참고자료

[Swift] 고차함수 (compactMap, flatMap)

0개의 댓글