1

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

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

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() + [
    [",", "<"],
    [".", ">"],
    ["/", "?"],
]

它根本无法用“太复杂的类型表达式”为我编译

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

4

2 回答 2

1

不幸的是,我无法解释为什么编译器无法评估这个相当简单的数组。然而,快速编译器经常被任何大/稍微复杂的数组表达式所淹没。因此,我为您的情况看到了三种可能的解决方案:

  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
}()
于 2021-08-08T10:36:04.977 回答
0

我最终确定的解决方法

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({ $0 })
于 2021-08-08T16:31:55.507 回答