2017-10-27 5 views
0

こんにちは私はチェスゲームを作ろうとしています、そして、私は現在、与えられた2つのチェスの四角形、四角形のチェスのスワップの機能を構築しようとしています。各四角形は、オプションのChessPieceオブジェクトを持つクラスです。私の現在の問題は、あるチェスの小節を他のチェスの小枝のプロパティに移動すると、両方のチェスの小節が、同じ四角形のプロパティを参照しているため、同じオブジェクトを指すことになります。 どのように私はオブジェクトのプロパティをスワップしますかSwift

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 
    } 
} 

は私が簡単にポジションを入れ替えることができますので、両方のchesspiecesの深いコピーを作成行く必要がありますか?そうでなければ、コメントされた行は、両方のchesspieceオブジェクトがメモリ内の同じ場所を指し示すように見えます。

+0

問題は正方形とチェスの両方がクラスであり、参照によって渡されるということです。それを格納している変数も同様に変更されます。 – victorydub

答えて

3

あなたは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) 

これは、印刷されます

Squ (行:1、col:1、chessPiece:オプション(ChessPiece(piece: "king")))

Square(行:2、col:2、chessPiece: オプション(ChessPiece(piece: "queen" ))))

+1

これは完璧に働いてくれてありがとう! – victorydub

+0

あなたは大歓迎です –

関連する問題