arrays - 为什么我不能在 Xcode 9.2 中的数组文字上调用 reduce(into:)?
问题描述
我正在寻找一种将数组映射到字典的方法并找到了这篇文章。这很有帮助。我将该帖子中的代码复制到操场上,它可以工作。
然后我决定更多地玩弄它:
[1,2,3].reduce(into: [Int: String](), {$0[$1] = $1.description})
我希望它会返回[1: "1", 2: "2", 3: "3"]
,但会发生编译器错误:
不能下标不正确或不明确类型的值
我试图减少到一个数组:
[1,2,3].reduce(into: [Int](), {$0.append($1)}) // I am aware that this is pointless
但它仍然无法编译。这次的信息不同:
在没有更多上下文的情况下,表达式的类型是模棱两可的
然后我发现这是因为我使用的是数组文字,因为如果我先声明一个常量数组,然后调用reduce
它,就不会出现错误:
let arr = [1,2,3]
arr.reduce(into: [Int: String](), {$0[$1] = $1.description})
不过,正常情况reduce
似乎适用于文字:
[1,2,3].reduce(0, +)
为什么不适reduce(into:)
用于数组文字?
解决方案
这是一个错误:SR-6995 无法推断reduce(into:)
同时已修复的类型,Xcode 9.3.1 将不再发生该错误。
有趣的是,在闭包中添加任何额外的语句就足以让它在 Xcode 9.2 中编译:
let d = [1,2,3].reduce(into: [Int: String](), {
() ; $0[$1] = $1.description
})
另一种选择是在闭包中明确指定累加器类型:
let d = [1,2,3].reduce(into: [Int: String](), { (accum: inout [Int: String], elem) in
accum[elem] = elem.description
})
或者,正如@vacawama 所注意到的,显式注释数组类型:
let d = ([1,2,3] as [Int]).reduce(into: [Int: String](), {
$0[$1] = $1.description
})
推荐阅读
- ldap - 如何通过phpldapserver在openLdap中添加自定义属性
- javascript - 如何将 React 组件作为道具传递给另一个组件
- azure - Azure 应用服务——Web.config 更改被覆盖
- powershell - Powershell - 使用 CYGWIN 运行 SCP 命令,但也扩展变量
- mysql - Laravel 文件缓存与 MySQL 主键搜索
- python - 在 PyTorch 中创建数据加载器类时遇到问题
- ios - 为 SwiftUI Path 元素添加阴影
- excel - excel中的子字符串使用公式
- c++ - 查找二叉搜索树是否有重复值
- c# - M2mqtt 使用字符串变量订阅主题