Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift filter dictionary error: Cannot assign a value of type '[(_, _)]' to a value of type '[_ : _]'

Tags:

ios

swift

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?

like image 271
warly Avatar asked Sep 16 '15 09:09

warly


2 Answers

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).

like image 166
Eric Aya Avatar answered Sep 27 '22 20:09

Eric Aya


data.forEach { if $1 != "Test" { data[$0] = nil } } 

Just another approach (a bit simplified) to filter out objects in your dictionary.

like image 45
Eendje Avatar answered Sep 27 '22 21:09

Eendje