斯威夫特 - "别名"对象的实例

时间:2016-08-08 16:04:13

标签: swift reference alias

使用简单的纸牌游戏来学习Swift和IOS编程。对于此功能,以下代码将起作用:

func dealCards() {

    for _ in 0...9 {

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

但是,我想轮换经销商。我知道我可以在if / else块中复制for循环,但我宁愿做这样的事情:

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

我确定它很简单,但我似乎无法弄清楚如何对播放器对象进行别名以便以这种方式使用它们。

2 个答案:

答案 0 :(得分:2)

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

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包含第一个接收卡片的玩家的索引。 Playerd以相同的顺序收到他们的卡片,绕着players.count位置。

答案 1 :(得分:2)

您的代码的问题似乎是您在每个pos1语句中定义pos2if,因此无法从这些语句外部访问这些值。您需要首先在语句外定义它们,然后在其中设置它们的值。您甚至可以分别将它们分别定义为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())
    }
}