Swift 数组连接的编译器速度

Swift compiler speed with array concatenation

我想了解对于程序员和编译器来说,在合理的时间内让以下代码编译的最不痛苦的方法是什么

extension Array {
    func unflat() -> [[Element]] {
        return self.map{[[=11=]]}
    }
}

let EnglishLayout: [[String]] = [
    ["1", "!"],
    ["2", "@"],
    ["3", "#"],
    ["4", "$"],
    ["5", "%"],
    ["6", "^"],
    ["7", "&"],
    ["8", "*"],
    ["9", "(", "-", "_"],
    ["0", ")", "=", "+"],
    ["Q", "`", "~"]
] + ["W", "E", "R", "T", "Y", "U", "I"].unflat() + [
    ["O", "[", "{"],
    ["P", "]", "}"],
] + ["A", "S", "D", "F", "G", "H", "J"].unflat() + [
    ["K", ";", ":"],
    ["L", "'", "\""],
    ["\", "|"],
] + ["Z", "X", "C", "V", "B", "N", "M"].unflat() + [
    [",", "<"],
    [".", ">"],
    ["/", "?"],
]

它根本无法为我编译 'too complex type expression'

我在构建设置中添加了分析标志,并注释掉了最后两部分 -Xfrontend -warn-long-expression-type-checking=100 显然,Swift 编译器太聪明了,无法选择阻力最小的路径,而只是按照程序员的指示将数组与显式类型声明连接起来。来自 Dart 和 TypeScript,如何解决这样的问题对我来说一点也不明显。

遗憾的是,我无法解释为什么编译器无法计算这个相当简单的数组。然而,swift 编译器经常被任何大的/稍微复杂的数组表达式淹没。因此,我看到针对您的情况的三种可能解决方案:

  1. 将内容写入辅助文件并从​​那里读取,例如 JSON 或 CSV 格式
  2. 手动解开内容(即不要写 ... + ["A", "B"].unflat()[["A"], ["B"]]
  3. 像这样使用闭包初始化数组:
let EnglishLayout: [[String]] = {
    var layout: [[String]] = [
        ["1", "!"],
        ["2", "@"],
        ["3", "#"],
        ["4", "$"],
        ["5", "%"],
        ["6", "^"],
        ["7", "&"],
        ["8", "*"],
        ["9", "(", "-", "_"],
        ["0", ")", "=", "+"],
        ["Q", "`", "~"]
    ]
    layout += ["W", "E", "R", "T", "Y", "U", "I"].unflat()
    layout += [
        ["O", "[", "{"],
        ["P", "]", "}"]
    ]
    layout += ["A", "S", "D", "F", "G", "H", "J"].unflat()
    layout += [
        ["K", ";", ":"],
        ["L", "'", "\""],
        ["\", "|"]
    ]
    layout += ["Z", "X", "C", "V", "B", "N", "M"].unflat()
    layout += [
        [",", "<"],
        [".", ">"],
        ["/", "?"]
    ]
    return layout
}()

我最终确定的解决方法

let EnglishLayout = [
    [
        ["1", "!"],
        ["2", "@"],
        ["3", "#"],
        ["4", "$"],
        ["5", "%"],
        ["6", "^"],
        ["7", "&"],
        ["8", "*"],
        ["9", "(", "-", "_"],
        ["0", ")", "=", "+"],
        ["Q", "`", "~"]
    ],
    ["W", "E", "R", "T", "Y", "U", "I"].unflat(),
    [
        ["O", "[", "{"],
        ["P", "]", "}"],
    ],
    ["A", "S", "D", "F", "G", "H", "J"].unflat(),
    [
        ["K", ";", ":"],
        ["L", "'", "\""],
        ["\", "|"],
    ],
    ["Z", "X", "C", "V", "B", "N", "M"].unflat(),
    [
        [",", "<"],
        [".", ">"],
        ["/", "?"],
    ]
    
].flatMap({ [=10=] })