代码之家  ›  专栏  ›  技术社区  ›  Sweeper

为什么我不能在Xcode9.2中的数组文字上调用reduce(into:)。

  •  2
  • Sweeper  · 技术社区  · 7 年前

    我在找一种方法把数组映射到字典中,找到了这个 post . 这很有帮助。我把那篇文章中的代码复制到一个操场上,它就工作了。

    然后我决定继续玩:

    [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})
    

    正常 减少 不过,在文字方面似乎效果不错:

    [1,2,3].reduce(0, +)
    

    为什么? reduce(into:) 不使用数组文本?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Martin R    7 年前

    这是一个错误: SR-6995 Unable to infer type with reduce(into:) 已经在 同时,Xcode 9.3.1不会再出现错误。

    有趣的是,这足以增加 任何 附加声明 使其在Xcode9.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
    })