2017-10-27 4 views
0

안녕하세요 저는 체스 게임을 만들려고 노력하고 있습니다. 저는 현재 주어진 두 개의 체스 사각형이 사각형에 체스 피스를 바꿔주는 함수를 만들려고합니다. 각 사각형은 선택적인 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 
    } 
} 

포지션을 쉽게 바꿀 수 있도록 양쪽 체스 피클을 모두 복사해야합니까? 그렇지 않으면 주석 처리 된 선은 두 개의 체스 조각 객체가 메모리의 같은 위치를 가리키고있는 것처럼 보입니다.

+0

사각형과 체스 피스는 모두 클래스이므로 참조로 전달됩니다. 변수를 저장하는 변수도 변경됩니다. – victorydub

답변

3

당신은 입출력 그들에게 스왑 방법을 사용하여 키워드를 추가하여 메서드 매개 변수 모두를 선언 할 수

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, COL : 1, chessPiece : 옵션 (ChessPiece (작품 : "왕")))

광장 (행 : 2, COL : 2, chessPiece : 옵션 (ChessPiece (작품 : "여왕")))

+1

감사합니다. 완벽하게 작동했습니다. – victorydub

+0

당신은 환영합니다 –