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
语句中定义了 pos1
和 pos2
,因此无法从这些语句外部访问这些值。您需要先在语句外部定义它们,然后在内部设置它们的值。您甚至可以最初将它们分别定义为 player1
和 player2
,然后交换它们的值 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())
}
}
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
语句中定义了 pos1
和 pos2
,因此无法从这些语句外部访问这些值。您需要先在语句外部定义它们,然后在内部设置它们的值。您甚至可以最初将它们分别定义为 player1
和 player2
,然后交换它们的值 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())
}
}