[Swift 정면돌파] 19. flatMap, compactMap

H43RO·2021년 8월 11일
0

Swift 정면돌파

목록 보기
19/19
post-thumbnail

오늘은 또 다른 고차함수인 flatMap, compactMap 에 대하여 알아보았다.

map 복습

map 은 배열 내부의 값을 하나씩 매핑한다고 생각하면 됨. 각 요소에 대한 값을 변경하고자 할 때 사용하고,
그 결과들을 배열의 상태로 반환함

let names = ["Chris", "Alex", "Ewa", "Barry", "Daniella"]
names.map {
  $0 + "'s name"
}
// ["Chris's name", "Alex's name", "Ewa's name", "Barry's name", "Daniella's name"]

let array = [1,2,3,4,5]
array.map {
    $0 + 1
}
// [2, 3, 4, 5, 6]

flatMap, compactMap 개념

Swift 4.1 버전 이후로 flatMapcompactMap 으로 변경
→ 그러나 flatMap 이 사라지는 것은 아님 (쓰임이 정확히 구분된 것)

1차원 배열의 경우

let array1 = [1, nil, 3, nil, 5, 6, 7]
let flatMapTest1 = array1.flatMap{ $0 }
let compactMapTest1 = array1.compactMap { $0 }

print("flatMapTest1 :", flatMapTest1)
print("compactMapTest1 :", compactMapTest1)

flatMapTest1 : [1, 3, 5, 6, 7]
compactMapTest1 : [1, 3, 5, 6, 7]

위 결과를 보면 동일하게 나타나는데, 이것은 1차원 배열에서만 그런 것임

기존 flatMap 은 배열을 flatten 하게 해주고 nil 을 제거하며 옵셔널 바인딩을 해주는 역할을 했음
→ Swift 4.1 부터는 1차원 배열에서 nil 을 제거하고 옵셔널 바인딩을 하고 싶을 때 compactMap 사용

2차원 배열의 경우

let array2: [[Int?]] = [[1, 2, 3], [nil, 5], [6, nil], [nil, nil]]
let flatMapTest2 = array2.flatMap { $0 }
let compactMapTest2 = array2.compactMap { $0 }

print("flatMapTest2 :",flatMapTest2)
print("compactMapTest2 :",compactMapTest2)

// flatMapTest2 : [Optional(1), Optional(2), Optional(3), nil, Optional(5), Optional(6), nil, nil, nil]
// compactMapTest2 : [[Optional(1), Optional(2), Optional(3)], [nil, Optional(5)], [Optional(6), nil], [nil, nil]]

flatMapcompactMapnil 제거하지 않고 1차원 배열일 때만 nil 제거함

flatMap은 2차원 배열을 1차원 배열로 만들어주는데, compactMap은 1차원 배열로 만들지 않음 (차이 확실)
→ 2차원 배열을 1차원으로 만들고 싶을 땐 flatMap 사용하면 됨

flatMapTest2 출력 값이 옵셔널 처리가 되어있는데, 이를 compactMap 으로 체이닝하면
옵셔널 바인딩이 되며 원하는 값을 가져올 수 있게 되는 것

let array2: [[Int?]] = [[1, 2, 3], [nil, 5], [6, nil], [nil, nil]]
let flatMapTest2 = array2.flatMap { $0 }.compactMap{ $0 }

// flatMapTest2 : [1, 2, 3, 5, 6]

결론

  • Swift 4.1 부터는 1차원 배열에서 nil 을 제거하고 옵셔널 바인딩하고 싶을 때 compactMap 사용
  • 2차원 배열을 1차원 배열로 만들고 싶을 때 flatMap 사용
profile
어려울수록 기본에 미치고 열광하라

0개의 댓글