2016-08-08 33 views
1

Arbeiten an einem einfachen Kartenspiel, um Swift und IOS-Programmierung zu lernen. Für diese Funktion funktioniert der folgende Code:Swift - "Alias" eine Instanz eines Objekts

func dealCards() { 

    for _ in 0...9 { 

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

Allerdings möchte ich den Händler drehen. Ich weiß, dass ich die for-Schleife innerhalb if/else Blöcke duplizieren könnte, aber ich würde lieber etwas tun:

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

Ich bin sicher, es ist einfach, aber ich kann nicht scheinen, um herauszufinden, wie man alias Mein Spieler Objekte, um sie auf diese Weise zu verwenden.

Antwort

2

Das Problem mit Ihrem Code scheint zu sein, dass Sie innerhalb jeder pos1 und pos2 Anweisung definieren, und daher können diese Werte nicht von außerhalb dieser Anweisungen zugegriffen werden. Sie müssen sie zuerst außerhalb der Anweisungen definieren und dann ihre Werte eingeben. Sie könnten sie sogar zunächst als player1 bzw. player2 definieren und ihre Werte gegen if player1.isDealer() tauschen.

Dies ist, wie es am Ende aussehen würde:

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

eine kompaktere Möglichkeit, dies zu tun wäre, um die Werte mit Tupeln und den ternären Operator zu tauschen:

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

kabiroberai - Viele Vielen Dank! – user1658921

+0

@ user1658921 Gern geschehen :) Nur fyi, habe ich meine erste Option aktualisiert, so dass es auch kompakter und einfacher zu verstehen ist, die Notwendigkeit der Else-Klausel zu beseitigen. – kabiroberai

2

Setzen Sie Ihre Spieler in ein Array, und machen eine Schleife umschlingen, wie folgt aus:

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

Variable startFrom enthält den Index des ersten Spieler eine Karte zu erhalten. Spieler erhalten ihre Karten in der gleichen Reihenfolge und wickeln sich um players.count Position.