首页 文章

错误:传递reduce函数的不可变值

提问于
浏览
8

我正在尝试执行以下代码将元组数组转换为字典但我收到编译错误说:

'[String:String]'类型的不可变值只有名为'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
}

为什么 initial 被声明为 var ?是否与 reduce's 签名 @noescape 有关?

func reduce<U>(initial: U, combine: @noescape (U, T) -> U) -> U

3 回答

  • 8

    您可以通过在 var 之前加上 dictionary 参数来使其变为可变:

    var final = array.reduce(initial) { (var dictionary, tuple) in
                                         ^^^
    

    但请注意,使用 reduce 会在每次迭代时创建一个新字典,这使得算法效率非常低 . 您可能需要考虑使用传统的 foreach 循环

  • 4

    Swift 4有一个新变种:

    var array = [("key0", "value0"), ("key1", "value1")]
    var initial = [String: String]()
    var final = array.reduce(into: initial) { dictionary, tuple in
        dictionary[tuple.0] = tuple.1
    }
    

    可以表达的是:

    var array = [("key0", "value0"), ("key1", "value1")]
    let final: [String: String] = array.reduce(into: [:]){ $0[$1.0] = $1.1 }
    
  • 5

    在Swift 3上:

    var final = array.reduce(initial) { (dictionary, tuple) -> [String: String] in
        var mutableDictionary = dictionary
        //.... make changes with mutableDictionary
        return mutableDictionary
    }
    

相关问题