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 编译器经常被任何大的/稍微复杂的数组表达式淹没。因此,我看到针对您的情况的三种可能解决方案:
- 将内容写入辅助文件并从那里读取,例如 JSON 或 CSV 格式
- 手动解开内容(即不要写
... + ["A", "B"].unflat()
但 [["A"], ["B"]]
- 像这样使用闭包初始化数组:
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=] })
我想了解对于程序员和编译器来说,在合理的时间内让以下代码编译的最不痛苦的方法是什么
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 编译器经常被任何大的/稍微复杂的数组表达式淹没。因此,我看到针对您的情况的三种可能解决方案:
- 将内容写入辅助文件并从那里读取,例如 JSON 或 CSV 格式
- 手动解开内容(即不要写
... + ["A", "B"].unflat()
但[["A"], ["B"]]
- 像这样使用闭包初始化数组:
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=] })