首页 > 解决方案 > 为什么我不能在 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:)用于数组文字?

标签: arraysswiftreducetype-inference

解决方案


这是一个错误: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
})

推荐阅读