嗨,我正在尝试制作一个国际象棋
游戏,我目前正在尝试构建一个函数,给定两个国际象棋方块,交换方块上的棋子。 每个方块都是一个具有可选 ChessPiece 对象的类。 我目前的问题是,当我将一个棋子移动到另一个正方形棋子属性时,两个棋子最终都指向同一个对象,因为它们随后引用了相同的方形属性。
private func swapSquares(square1: Square, square2: Square) {
if square1.chessPiece == nil && square2.chessPiece == nil {
return
}
var square1ChessPiece: ChessPiece?
var square2ChessPiece: ChessPiece?
if let square1piece = square1.chessPiece {
square1ChessPiece = square1piece
}
if let square2piece = square2.chessPiece {
square2ChessPiece = square2piece
}
if let square1piece = square1ChessPiece {
square1piece.frame = square2.frame
square1piece.square = square2
square2.chessPiece = square1piece // after this, square1ChessPiece and Square2Chess become the same
}
if let square2piece = square2ChessPiece {
square2piece.frame = square1.frame
square2piece.square = square1
square1.chessPiece = square2piece
}
}
我是否需要制作两个棋子的深度副本,以便我可以轻松地交换位置? 否则,注释行似乎只会让两个棋子对象指向内存中的同一位置。
您可以使用 swap 方法并声明两个方法参数,并向它们添加关键字 inout:
struct ChessPiece {
let piece: String
}
struct Square {
let row: Int
let col: Int
var chessPiece: ChessPiece?
}
private func swapSquaresPieces(square1: inout Square, square2: inout Square) {
swap(&square1.chessPiece, &square2.chessPiece)
}
var square1 = Square(row: 1, col: 1, chessPiece: ChessPiece(piece: "queen"))
var square2 = Square(row: 2, col: 2, chessPiece: ChessPiece(piece: "king"))
swapSquaresPieces(square1: &square1, square2: &square2)
print(square1)
print(square2)
这将打印
正方形(行: 1, 列: 1, 棋子: 可选(棋子: "国王")))
正方形(行: 2, 列: 2, 棋子: 可选(棋子(棋子:"女王")))