Dictionaries are one of the most commonly used data structures. Dictionaries come with keys and values where the keys are unique. Sometimes, there might be a situation where we would want to swap the keys and values of a dictionary. Let’s see how to swap keys and values of a dictionary in swift.

While doing so, we need to make sure that the values which are converted to keys are hashable and unique, else the conversion will fail.

extension Dictionary where Value: Hashable {
    struct DuplicateValuesError: Error { }
    init?(swappingKeysAndValues dict: [Value:  Key]) {
        do {
            try self.init(dict.lazy.map { ($0.value, $0.key) },
                          uniquingKeysWith: { _,_ in throw DuplicateValuesError() })
        } catch {
            return nil
        }
    }
}
let dict = [1 : "A", 2 : "B", 3 : "C", 4 : "D", 5 : "E"]
if let swappedDict = Dictionary(swappingKeysAndValues: dict) {
    print(swappedDict)
}else{
    print("Unable to swap keys and values")
}
Result:
["A": 1, "D": 4, "C": 3, "E": 5, "B": 2]

The given code tries to swap keys and values of the given dictionary, and in case something goes wrong, it fails gracefully.

Do you know a better approach than the one mentioned in this article? Let me know in the comments.

Credits and References

[1] https://stackoverflow.com/a/50008875

[2] https://cocoacasts.com/what-is-a-lazymapcollection-in-swift

About the author