加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 04:48:42 所属栏目:百科 来源:网络整理
导读:我正在尝试在数组上使用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对象分配
我正在尝试在数组上使用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] ?? "") })

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读