Swift -- "alias" 一个对象的实例

Swift -- "alias" an instance of an object

Working on a simple card game to learn Swift and IOS programming. For this function, the following code will work:

func dealCards() {

    for _ in 0...9 {

        player1.cardDealt(deck.getNextCard())
        player2.cardDealt(deck.getNextCard())    
    }
}

However, I would like to rotate the dealer. I know that I could duplicate the for loop within if/else blocks, but I would rather do something like this:

func dealCards() {

    // Dealer is considered position 2
    if player1.isDealer() {
        let pos1 = player2
        let pos2 = player1
    }
    else {
        let pos1 = player1
        let pos2 = player2
    }
    for _ in 0...9 {
        pos1.cardDealt(deck.getNextCard())
        pos2.cardDealt(deck.getNextCard())
    }
}

I'm sure it's simple, but I can't seem to figure out how to alias my player objects to use them in this way.

将你的玩家放入一个数组中,然后循环环绕,如下所示:

let players = [player1, player2, player3, ...] 
var startFrom = 0 // Set to 1 to start from player2, 2 to start from player3, etc.
for _ in 0...9 {
    for i in 0..<players.count {
        players[(startFrom + i) % players.count].cardDealt(deck.getNextCard())
    }
}

变量startFrom包含第一个拿到牌的玩家的索引。玩家以相同的顺序收到他们的牌,在 players.count 位置环绕。

您的代码的问题似乎是您在每个 if 语句中定义了 pos1pos2,因此无法从这些语句外部访问这些值。您需要先在语句外部定义它们,然后在内部设置它们的值。您甚至可以最初将它们分别定义为 player1player2,然后交换它们的值 if player1.isDealer().

这是最终的样子:

func dealCards() {
    let pos1 = player1
    let pos2 = player2

    // Dealer is considered position 2
    if player1.isDealer() {
        pos1 = player2
        pos2 = player1
    }

    for _ in 0...9 {
        pos1.cardDealt(deck.getNextCard())
        pos2.cardDealt(deck.getNextCard())
    }
}

一种更紧凑的方法是使用元组和三元运算符交换值:

   func dealCards() {

    // Dealer is considered position 2
    let (pos1, pos2) = player1.isDealer() ? (player2, player1) : (player1, player2)
    //If player1 is the dealer, swap pos1 and pos2
    for _ in 0...9 {
        pos1.cardDealt(deck.getNextCard())
        pos2.cardDealt(deck.getNextCard())
    }
}