오늘은 또 다른 고차함수인 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 버전 이후로 flatMap
이 compactMap
으로 변경
→ 그러나 flatMap
이 사라지는 것은 아님 (쓰임이 정확히 구분된 것)
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
사용
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]]
flatMap
과 compactMap
은 nil
제거하지 않고 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]
nil
을 제거하고 옵셔널 바인딩하고 싶을 때 compactMap
사용flatMap
사용