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
相关产品推荐
相关产品推荐

