Быстрая скорость компилятора с объединением массивов

Я хотел бы понять, что может быть наименее болезненным для программиста и компилятора, чтобы следующий код скомпилировался за разумное время.

      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 часто перегружен любыми большими / слегка сложными выражениями массива. Поэтому я вижу три возможных решения для вашего случая:

  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({ $0 })
Другие вопросы по тегам