2020. 7. 2. 16:19ㆍLanguage/Swift
flatMap(_:)
Returns an array containing the concatenated results of calling the given transformation with each element of this sequence.
이 시퀀스의 각 요소와 함께 지정된 변환을 호출하는 연결된 결과를 포함하는 배열을 반환한다.
compactMap(_:)
Returns an array containing the non-nil results of calling the given transformation with each element of this sequence.
이 시퀀스의 각 요소를 사용하여 지정된 변환을 호출한 nil이 아닌 결과를 포함하는 배열을 반환한다.
Swift 5.0 기준입니다. (4.1 버전이하는 다르게 작동합니다. flatMap)
flatMap을 공부할려고 끄적이다 보니 어찌어찌 compactMap, map까지 한번에 공부를 해야 이해가 쉽더라구요.
flatMap은 평평하게 + 매핑 2차원 배열을 1차원으로 만들어 주며, nil값을 제외하여 반환해 준다.
하지만 Swift 5.0이상 부터는 1차원 nil값이 있는 배열에 flatMap을 사용하게 되면 compactMap을 사용하라고 경고메시지를 줍니다.
compactMap은 nil값을 제외하여 배열로 표현해준다. 이렇게 요약이 가능하네요.
아래 map, flatmap, compactmap 이렇게 3개에 대해서 예문을 봐볼게요.
let numbers = [1,nil, 2, 3, 4, nil]
let mapped = numbers.map { $0 }
print(mapped)
let flatMap = numbers.flatMap { $0 }
print(flatMapped)
let compactMap = numbers.compactMap { $0 }
print(compactMap)
[Optional(1), nil, Optional(2), Optional(3), Optional(4), nil]
[1, 2, 3, 4]
[1, 2, 3, 4]
위에서 보이듯이 map은 옵셔널이 모두 붙으며, nil값 또한 배열에 포함 되어 있지만
flatMap, compactMap은 모두 nil값을 제외하고 배열로 반환해주고 있어요.
let numbers = [[1,2,3], [nil,5], [6,nil], [7,8,9]]
let mapped = numbers.map { $0 }
print(mapped)
let flatMap = numbers.flatMap { $0 }
print(flatMap)
let compactMap = numbers.compactMap { $0 }
print(compactMap)
[[Optional(1), Optional(2), Optional(3)], [nil, Optional(5)], [Optional(6), nil], [Optional(7), Optional(8), Optional(9)]]
[Optional(1), Optional(2), Optional(3), nil, Optional(5), Optional(6), nil, Optional(7), Optional(8), Optional(9)]
[[Optional(1), Optional(2), Optional(3)], [nil, Optional(5)], [Optional(6), nil], [Optional(7), Optional(8), Optional(9)]]
자 이렇게 2차원 배열로 변경하면 map과 compactMap은 모두 동일한 결과물을 반환하게되는데
flatMap은 2차원 배열을 모두 1차원으로 호환해주고 있습니다.
let numbers = [[1,2,3], [nil,5], [6,nil], [7,8,9]]
let flatCompactMap = numbers.flatMap { $0 }.compactMap { $0 }
let flatDoubleMapped = numbers.flatMap { $0 }.flatMap { $0 }
print(flatCompactMap)
print(flatDoubleMapped)
// [1, 2, 3, 5, 6, 7, 8, 9]
// [1, 2, 3, 5, 6, 7, 8, 9]
이렇게 한번더 compactMap, flatMap 을 진행하게 되면 nil값 까지 모두 제거 되어 1차원 배열이 되조
아래처럼 확장해서 사용할 수도 있습니다.
et numbers = [[1,2,3], [nil,5], [6,nil], [7,8,9]]
let flatMap = numbers.flatMap { $0 }.compactMap { $0 }.map { Array(repeating: $0, count: 1)}
print(flatMap)
// [[1], [2], [3], [5], [6], [7], [8], [9]]
저도 아직 공부중이라서 정확하지 않은 부분과 활용에서 미비한 부분이 있어요 ㅠㅠ 감안하고 봐주세요.
'Language > Swift' 카테고리의 다른 글
Swift - 고급() 연산자 (0) | 2020.07.07 |
---|---|
Swift - zip (0) | 2020.07.06 |
Swift - stride (0) | 2020.07.01 |
Swift - map (0) | 2020.06.29 |
Swift - filter (0) | 2020.06.29 |