You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift移植JS代码时Array<Dictionary>赋值给Dictionary报错如何解决

问题原因
  • 你当前代码报错是因为类型不匹配:node.stylesMap 是字典数组类型 [[StyleID: Style]],而 objectNode.stylesMap 要求的是单个字典类型 [StyleID: Style],无法直接赋值。
  • 你对JS Map和Swift Dictionary的对应关系理解是正确的,问题出在JS中 new Map(stylesArray) 会自动把入参数组里的键值对合并为单个Map,而Swift没有对应的隐式转换,需要手动合并数组里的所有字典为单个字典。
解决方法

替换你代码里报错的赋值行即可:

// 遍历数组中所有小字典,合并为一个大字典,重复key保留后出现的(和JS Map默认逻辑一致)
let mergedStyles = stylesArray.reduce(into: [StyleID: Style]()) { result, singleDict in
    result.merge(singleDict) { _, newValue in newValue }
}
objectNode.stylesMap = mergedStyles
补充说明
  • 如果遇到重复key需要保留先出现的,把merge的闭包改成 { oldValue, _ in oldValue } 即可。
  • 如果你后续调整了node.stylesMap的类型为键值对数组[(StyleID, Style)](和JS传入Map的参数结构完全对齐),可以用更简洁的写法:
// 无重复key的情况
let mergedStyles = Dictionary(uniqueKeysWithValues: stylesArray)
// 有重复key的情况,保留后出现的
let mergedStyles = Dictionary(stylesArray) { _, newValue in newValue }

内容的提问来源于stack exchange,提问作者newUserA A

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 17:54:03