2017-12-31 141 views
0

Ich beginne gerade, Swift zu lernen und finde nicht heraus, wie man ein zufälliges Array von Swift auswählt, ohne dass es jeden Klick für das Konzentrationsspiel ändert. Im Wesentlichen ist mein Ziel, einen zufälligen Wert, der ein Array ist, aus einem Wörterbuch auszuwählen und für den Rest des Laufs zu verwenden. Das Problem, auf das ich stoße, ist, dass mein zufälliger Index randomThemeIndex jeden Klick ändert und nicht das gleiche Thema für alle Karten im Spiel behält. Daher werden verschiedene Elemente aus jedem Wert im Wörterbuch ausgewählt und nicht nur ein Wert/Array. Hier ist, was ich habe bisher:Auswählen eines zufälligen Wertes (Array) aus dem Wörterbuch

var themeChoices = ["halloween": ["", "", "", "", "", "", "", "", "", ""], 
        "animals": ["", "", "", "", "", "", "", "", "", ""], 
        "faces": ["", "", "", "", "", "", "", "", "", "", ""], 
        "nature": ["", "", "", "", "", "", "", "", "", "", "❄️", ""], 
        "food": ["", "", "", "", "", "", "", "", "", "", "", ""], 
        "sports": ["⚽️", "", "", "", "", "⛳️", "", "", "‍♀️", "", "️"]] 

var emoji = [Int:String]() 


func emoji(for card: Card) -> String { 
    let themeCount = themeChoices.count 
    let randomThemeIndex = Int(arc4random_uniform(UInt32(themeCount))) 
    print(randomThemeIndex) 
    var randomTheme = Array(themeChoices.values)[randomThemeIndex] 
    if emoji[card.identifier] == nil, randomTheme.count > 0 { 
     let randomCardIndex = Int(arc4random_uniform(UInt32(randomTheme.count - 1))) 
     emoji[card.identifier] = randomTheme.remove(at: randomCardIndex) 
    } 
    return emoji[card.identifier] ?? "?" 
} 
+0

wo Ihre Karte Erklärung –

+1

Sie eine neue Zufallszahl jedes Mal zu erzeugen Sie diese Methode aufrufen. Sie müssen ein zufälliges Thema an einer anderen Stelle auswählen, die Sie nur einmal aufrufen, und dieses Thema dann in dieser Funktion verwenden. – Paulw11

+0

emoji [card.identifier]? Es ist nichts für ungut, aber Sie sollten zurück zu Büchern gehen. –

Antwort

0

Sie wollen nicht eine neue zufällige Anordnung wählen jedes Mal, wenn Sie emoji(for:) nennen, nicht wahr? Daher müssen Sie den aktiven Array-Index irgendwo speichern und jedes Mal verwenden.

Statt dessen:

func emoji(for card: Card) -> String { 
    let themeCount = themeChoices.count 
    let randomThemeIndex = Int(arc4random_uniform(UInt32(themeCount))) 

wie diese versuchen:

func emoji(for card: Card, inTheme randomThemeIndex: Int) -> String { 
    // remove those two lines and keep the rest 

Nun müssen Sie das Thema Index hinzufügen, so dass anstelle emoji(for: card) zu rufen, dann würden Sie emoji(for: card, inTheme: themeIndex) nennen.

Sie müssen auch den Themenindex irgendwo speichern. Ich weiß nicht, wo Sie sollten das tun, weil es nicht genug Code in Ihrem Beispiel ist, aber es kann wie folgt aussehen:

lazy var themeIndex: Int = { 
    let themeCount = themeChoices.count 
    return Int(arc4random_uniform(UInt32(themeCount))) 
}() 

, die Sie könnten dann Zugriff als self.themeIndex.

_ (ツ) _/¯

Verwandte Themen