Saya sedang menulis sebuah fungsi yang menghitung gerakan seorang ksatria dalam permainan catur. Fungsi ini akan mengambil potongan ksatria tipe UInt64 dan memetakannya dengan fungsi lambda saya, knightMovementLambda, dan mengembalikan daftar UInt64 baru.

Saya bingung mengapa fungsi lambda saya membutuhkan begitu banyak waktu untuk dikompilasi sampai-sampai Xcode melempar kesalahan batas waktu. Sejauh yang saya mengerti, di bawah ini adalah lambda yang valid di Swift. Pertanyaan saya adalah, apakah Swift memberlakukan batasan ukuran pada ekspresi di lambda pada waktu kompilasi?

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
Miket25 10 Maret 2019, 23:17

1 menjawab

Jawaban Terbaik

Swift mengalami kesulitan mengetik saat memeriksa ekspresi besar. Pecah pernyataan Anda menjadi sub-ekspresi seperti ini misalnya:

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
}
0
vacawama 10 Maret 2019, 20:37