Размер лямбды / замыкания вызывает тайм-аут при компиляции - PullRequest
0 голосов
/ 10 марта 2019

Я пишу функцию, которая вычисляет ходы коня в игре в шахматы.Эта функция возьмет фигуры рыцаря типа UInt64 и отобразит их с помощью моей лямбда-функции knightMovementLambda, и вернет список новых UInt64.

Я не понимаю, почему моя лямбда-функция требует столько времени для компиляции, что Xcode выдает ошибку тайм-аута.Насколько я понимаю, ниже действительная лямбда в Swift.У меня вопрос: накладывает ли Swift ограничение на размер выражения в лямбде во время компиляции?

let FILE_A:UInt64 = 0x0101010101010101
let FILE_B:UInt64 = 0x0202020202020202
let FILE_G:UInt64 = 0x4040404040404040
let FILE_H:UInt64 = 0x8080808080808080

func getKnightMoves() -> [UInt64] {

    /* Unrelated setup/variables */

    let knightMovementLambda:(UInt64) -> UInt64 = {(x:UInt64) -> UInt64 in
            (~FILE_A & x) << 17 |
            (~(FILE_A | FILE_B) & x) << 10 |
            (~(FILE_A | FILE_B) & x) >> 6 |
            (~FILE_A & x) >> 15 |
            (~FILE_H & x) << 15 |
            (~(FILE_G|FILE_H) & x) << 6 |
            (~(FILE_G|FILE_H) & x) >> 10 |
            (~FILE_H & x) >> 17
    }

    /* Return valid moves list after mapping */

    return []

}

1 Ответ

0 голосов
/ 10 марта 2019

Swift испытывает трудности при проверке типов больших выражений.Разбейте ваше утверждение на подвыражения, например, например:

let knightMovementLambda: (UInt64) -> UInt64 = { (x: UInt64) -> UInt64 in
    var result = (~FILE_A & x) << 17
    result |= (~(FILE_A | FILE_B) & x) << 10
    result |= (~(FILE_A | FILE_B) & x) >> 6
    result |= (~FILE_A & x) >> 15
    result |= (~FILE_H & x) << 15
    result |= (~(FILE_G|FILE_H) & x) << 6
    result |= (~(FILE_G|FILE_H) & x) >> 10
    result |= (~FILE_H & x) >> 17

    return result
}
...