I'm trying to do the following code that transforms an array of tuples into a dictionary but I'm receiving a compile error saying:
Immutable value of type '[String : String]' only has mutating members named 'updateValue'
var array = [("key0", "value0"), ("key1", "value1")]
var initial = [String: String]()
var final = array.reduce(initial) { (dictionary, tuple) in
dictionary.updateValue(tuple.0, forKey: tuple.1)
return dictionary
}
Why is that if initial was declared as var? Does it have to do with @noescape on reduce's signature?
func reduce<U>(initial: U, combine: @noescape (U, T) -> U) -> U
You can simply make the dictionary
parameter mutable by preceding it with var
:
var final = array.reduce(initial) { (var dictionary, tuple) in
^^^
Note however that using reduce
a new dictionary is created at each iteration, making the algorithm very inefficient. You might want to consider using a traditional foreach
loop
Swift 4 has a new variant:
var array = [("key0", "value0"), ("key1", "value1")]
var initial = [String: String]()
var final = array.reduce(into: initial) { dictionary, tuple in
dictionary[tuple.0] = tuple.1
}
Which could be expressed:
var array = [("key0", "value0"), ("key1", "value1")]
let final: [String: String] = array.reduce(into: [:]){ $0[$1.0] = $1.1 }
On Swift 3:
var final = array.reduce(initial) { (dictionary, tuple) -> [String: String] in
var mutableDictionary = dictionary
//.... make changes with mutableDictionary
return mutableDictionary
}
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