안녕하세요! 오늘은 .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
'Apple > Apple_Swift' 카테고리의 다른 글
Swift 5.0 Result Type 소개 (에러 처리를 쉽고 깔끔하게 결과는 명확하게 SE-0235) (0) | 2022.12.27 |
---|---|
Swift5.0 Character Properties (띄어쓰기, 공백, 숫자, 소문자 등등.. 확인 가능해요) SE-0221 (0) | 2022.12.26 |
Swift 5.0 유니코드 스칼라 프로퍼티 추가 (Unicode Scalar Properties) SE-0211 (2) | 2022.12.20 |
Raw String(문자열)을 쉽게 표현하자 # ... # ("\" 문자 지옥에서 벗어나기) SE-0200 (0) | 2022.12.19 |
Swift Enum의 활용 (구조체 또는 클래스 대신 열거형으로 정리해봐요) (0) | 2020.04.01 |