我正在尝试在数组上使用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”参数,可以在闭包中进行变异.
这样效率更高,因为每个都没有制作副本
迭代步骤.
一个不同的Swift 4解决方案是创建一个新的字典
通过将每个字段映射到键/值对:
let stats = Dictionary(uniqueKeysWithValues: fields.map { ($0,json[$0] ?? "") })
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。