我正在写一个函数来计算国际象棋中骑士的移动。此函数将使用类型为UInt64
的骑士碎片,并将其与我的lambda函数knightMovementLambda
映射,并返回新的UInt64
的列表。
我对为什么我的lambda函数要花这么多时间编译到Xcode抛出超时错误的点感到困惑。据我了解,以下是Swift中的有效lambda。我的问题是,Swift在编译时是否会对lambda中的表达式施加大小限制?
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 []
}
答案 0 :(得分:0)
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
}