Быстрая скорость компилятора с объединением массивов
Я хотел бы понять, что может быть наименее болезненным для программиста и компилятора, чтобы следующий код скомпилировался за разумное время.
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, мне совсем не очевидно, как решать подобные проблемы.
2 ответа
К сожалению, я не могу объяснить, почему компилятор не может оценить этот довольно простой массив. Однако компилятор 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({ $0 })