Swift5.0 Dictionary를 위한 고차함수 .compactMapValues 소개 SE-0218

안녕하세요! 오늘은 .compactMapValues에 대해서 소개해 드리려고 합니다~!

찾아보니 정말 편리하다고 느꼈는데요. 왜 그런지 같이 살펴보시죠~!

 

예시를 들면서 소개해 드리면 좋을거 같습니다.

아래 코드를 보시죠

let d: [String: String?] = ["a": "1", "b": nil, "c": "3"]
let r1 = d.filter { $0.value != nil }.mapValues { $0! }
let r2 = d.reduce(into: [String: String]()) { (result, item) in result[item.key] = item.value }
// r1 == r2 == ["a": "1", "c": "3"]

Dictionary 값에 문자, nil 값이 같이 있는 상황이네요

nil값은 원하지 않으니 제거해야 되겠고, 거기서 다시 조합해서 딕셔너리 형태로 만들어 리턴하고 있습니다.

코드가 좀 복잡해 보이네요.

 

자 이제 compactMapValues를 사용해서 위 코드의 문제를 해결 해보겠습니다.

let d: [String: String?] = ["a": "1", "b": nil, "c": "3"]
let r4 = d.compactMapValues({$0})
// r4 == ["a": "1", "c": "3"]

와우... 보기만해도 정말 마음에 편안해지는 코드네요.

위에서 여러 고차함수를 호출해서 Dictionary의 nil값을 제거하는 모습을 봤었는데 1줄로 모든것이 끝났습니다.

 

다음 예제도 같이 살펴보시죠

let d: [String: String] = ["a": "1", "b": "2", "c": "three"]
let r1 = d.mapValues(Int.init).filter { $0.value != nil }.mapValues { $0! }
let r2 = d.reduce(into: [String: Int]()) { (result, item) in result[item.key] = Int(item.value) }
// r == ["a": 1, "b": 2]

여기서는 숫자 문자를 숫자로 변환한 value값을 갖는 Dictionary 값을 만들어 리턴하는 모습이 보입니다.

숫자 문자가 아닌 다른 문자열을 갖고 있는 값은 지우고 있고요

역시 복잡해보입니다.

 

위 코드가 어떻게 변했는지 아래코드 보시죠

let d: [String: String] = ["a": "1", "b": "2", "c": "three"]
let r5 = d.compactMapValues(Int.init)
// r5 == ["a": 1, "b": 2]

Init.init을 compactMapValues에 넣어 호출 후 위와 동일한 결과값을 만들어 냈습니다.

Dictionary 사용시 매우 유용해 보이네요.

 

오늘은 여기까지 입니다.

다음시간에 뵙겠습니다~!! 감사합니다.

 

 

출처: https://github.com/apple/swift-evolution/blob/main/proposals/0218-introduce-compact-map-values.md