微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

arrays – Array.reduce不能通过下标分配:’x’是’let’常量

我正在尝试在数组上使用reduce函数

var fields = ["gender","name","nickname"]
var stats = fields.reduce([String:String]()) { (res,field) -> [String:String] in
  res[field] = json[field] ?? ""
  return res
}

它只是通过fields数组并将值从json对象分配给res.

对我来说似乎很简单,但编译器一直说:

error: cannot assign through subscript: ‘res’ is a ‘let’ constant

在线上:

res[field] = json[field] ?? ""

这对我没有任何意义,因为我从未指定res或stats为let.

解决方法

闭包参数(除非用inout声明)是隐式常量,就像用let声明一样.
如果你想修改它,那么你必须先制作可变副本:

let stats = fields.reduce([String:String]()) { (res,field) -> [String:String] in
    var res = res
    res[field] = json[field] ?? ""
    return res
}

从Swift 4开始,您可以使用reduce(into:_:)

let stats = fields.reduce(into: [String:String]()) { (res,field) in
    res[field] = json[field] ?? ""
}

这里res是一个“inout”参数,可以在闭包中进行变异.
这样效率更高,因为每个都没有制作副本
迭代步骤.

另见SE-0171 Reduce with inout.

一个不同的Swift 4解决方案是创建一个新的字典
通过将每个字段映射到键/值对:

let stats = Dictionary(uniqueKeysWithValues: fields.map { ($0,json[$0] ?? "") })

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐