2017-01-06 2 views
-1

Ich möchte ein Deck von 10 Karten aus einem Set mit mehreren Farben erstellen. Es sind jedoch möglicherweise nur einige Farben verfügbar.
Ich habe daher eine Funktion validCards() -> [Card] erstellt, die 10 gültige Karten aus dem Deck auswählen und sie als ein Array von Karten zurückgeben sollte. Es tut dies durch Wiederholung eine Karte zu holen, bis sie gültig ist:Swift3 Parameter außerhalb Wiederholungs-While-Schleife

func validCards() -> [Card] { 
    let availableSuits: [String] = ["Diamond"] 
    let deck: [Card] = Card.deck() 
    var validDeck: [Card] = [] 
    for i in 0...10 { 
     repeat { 
      let (card, index) = deck.randomElement() 
     } while !availableSuits.contains(card.suit) "|ERROR: Use of unresolved identifier card" 
     validDeck.append(card) "|ERROR: Use of unresolved identifier card" 
    } 
    return validDeck 
} 

Der einzig mögliche Grund für die Fehler in Zeile 8 und 9 (soweit ich weiß) ist, dass die Variable innerhalb der repeat {} lokal Schleife.
jedoch rasch mich nicht lassen, einfach public var schreiben, einen Fehler wirft „Attribut Öffentlichkeit kann nur in einem nicht-lokalen Bereich angewandt werden.

Kann mir jemand helfen? Vielen Dank im Voraus, Narusan

. PS: ich habe eine Struktur, die Card definiert, ist es völlig in Ordnung, und auch der Array-Erweiterung randomElement arbeiten Arbeits

+1

'lassen (Karte, Index)' 'innen repeat' Block ist, so dass es nicht verfügbar außerhalb dieses Blocks ist, müssen Sie Tupel deklarieren, bevor Wiederholungsblock wie' var (card, index): (Card, Int) ' –

+1

Es sieht auch so aus, als wäre' suit' eine String-Eigenschaft, also musst du contains mit deinem 'availableSuits'-Array verwenden. –

+0

Ja, das habe ich gerade auch bemerkt. Vielen Dank – Narusan

Antwort

1

Sie haben soeben eine Forward-Deklaration müssen, so dass der Umfang der card nicht nur auf das beschränkt ist, repeat Block:

func validCards() -> [Card] { 
    let availableSuits = ["Diamond"] 
    let deck = Card.deck() 
    var validDeck = [Card]() 
    for i in 0...10 { 
     let card: Card 
     let index: Index 
     repeat { 
      (card, index) = deck.randomElement() 
     } while card.suit != availableSuits "|ERROR: Use of unresolved identifier card" 
     validDeck.append(card) "|ERROR: Use of unresolved identifier card" 
    } 
    return validDeck 
} 
+0

Haha, wie dumm von mir, nicht daran zu denken. Natürlich muss es so gemacht werden. Ich werde Ihre Antwort so schnell wie möglich annehmen (10 Minuten nachdem die Frage gestellt wurde) – Narusan

+2

Dies ist eine Lösung für Ihre genaue Frage, aber Niravs Vorschlag ist viel besser – Alexander

+0

Danke für die Ehrlichkeit. Am Ende habe ich es Nirav selbst angetan, aber deine Antwort war umfangreicher! – Narusan