swift - Lambda/封闭大小导致编译时超时

原文 标签 swift lambda compilation closures

我正在写一个函数来计算国际象棋中骑士的移动。该函数将使用类型为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 []

}

最佳答案

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
}

关于swift - Lambda/封闭大小导致编译时超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55091981/

相关文章:

ubuntu - 如何在 Ubuntu 中跟上 Node.js 的最新版本?聚丙烯酰胺?编译?

C++ 程序无法通过 system() 函数调用找到 Latex 命令

swift - 仅当一个表达式中的 optional 项不为零时才调用函数?

ios - 在Swift 3.0中使用rangeOfCharacter

arrays - 过滤器自定义阵列时间优化

c# - 如何将变量定义为 lambda 函数

c++ - 在函数中使用 std::array 使用 'overloaded' lambda

java - 我如何通过 lambda 创建字符串比较器?

ios - Swift - 文本字段键盘返回键不起作用?

c++ - 在32位Windows上使用libcurl