如何交换对象属性 Swift


嗨,我正在尝试制作一个国际象棋

游戏,我目前正在尝试构建一个函数,给定两个国际象棋方块,交换方块上的棋子。 每个方块都是一个具有可选 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, 棋子: 可选(棋子(棋子:"女王")))

最新更新