I am trying to filter a dictionary in swift:
var data: [String: String] = [:] data = data.filter { $0.1 == "Test" }
the filter code above compiles under Swift 2 but yields the following error:
Cannot assign a value of type '[(String, String)]' to a value of type '[String : String]'
is this a bug in the Swift compiler or is this not the right way to filter dictionaries in Swift?
This has been fixed in Swift 4
let data = ["a": 0, "b": 42] let filtered = data.filter { $0.value > 10 } print(filtered) // ["b": 42]
In Swift 4, a filtered dictionary returns a dictionary.
Original answer for Swift 2 and 3
The problem is that data
is a dictionary but the result of filter
is an array, so the error message says that you can't assign the result of the latter to the former.
You could just create a new variable/constant for your resulting array:
let data: [String: String] = [:] let filtered = data.filter { $0.1 == "Test" }
Here filtered
is an array of tuples: [(String, String)]
.
Once filtered, you can recreate a new dictionary if this is what you need:
var newData = [String:String]() for result in filtered { newData[result.0] = result.1 }
If you decide not to use filter
you could mutate your original dictionary or a copy of it:
var data = ["a":"Test", "b":"nope"] for (key, value) in data { if value != "Test" { data.removeValueForKey(key) } } print(data) // ["a": "Test"]
Note: in Swift 3, removeValueForKey
has been renamed removeValue(forKey:)
, so in this example it becomes data.removeValue(forKey: key)
.
data.forEach { if $1 != "Test" { data[$0] = nil } }
Just another approach (a bit simplified) to filter out objects in your dictionary.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With