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/

相关文章:

Java - 通过参数传递方法

java - 为什么只要遵守 datepicker1.setValue( ) 就会触发 JavaFx datepicker1.setOnAction 事件?

nginx - 在 Alpine Linux 3.11 上编译 Nginx

ios - 如何通过presentViewController 将对象传递到 View 中?

ios - Swift 中的 4 x 2 按钮键盘

c# - 如何使用 lambda 表达式和 linq 从范围中获取元素?

c - 创建/调用 DLL 时出现问题

css - 如何使用 brunch 编译 less css 文件

json - 使用 SwiftyJSON 和 AlamoFire 解析数据并在 View 之间传输数据

ios - Date()显示错误的时间