SE-0218 adds a new compactMapValues()
method to dictionaries, bringing together the compactMap()
functionality from arrays (“transform my values, unwrap the results, then discard anything that’s nil”) with the mapValues()
method from dictionaries (“leave my keys intact but transform my values”).
As an example, here’s a dictionary of people in a race, along with the times they took to finish in seconds. One person did not finish, marked as “DNF”:
let times = [
"Hudson": "38",
"Clarke": "42",
"Robinson": "35",
"Hartis": "DNF"
]
We can use compactMapValues()
to create a new dictionary with names and times as an integer, with the one DNF person removed:
let finishers1 = times.compactMapValues { Int($0) }
Alternatively, you could just pass the Int
initializer directly to compactMapValues()
, like this:
let finishers2 = times.compactMapValues(Int.init)
You can also use compactMapValues()
to unwrap optionals and discard nil values without performing any sort of transformation, like this:
let people = [
"Paul": 38,
"Sophie": 8,
"Charlotte": 5,
"William": nil
]
let knownAges = people.compactMapValues { $0 }
SAVE 50% All our books and bundles are half price for Black Friday, so you can take your Swift knowledge further without spending big! Get the Swift Power Pack to build your iOS career faster, get the Swift Platform Pack to builds apps for macOS, watchOS, and beyond, or get the Swift Plus Pack to learn advanced design patterns, testing skills, and more.
Download all Swift 5.0 changes as a playground Link to Swift 5.0 changes
Link copied to your pasteboard.