2016-10-03 7 views
1

Ich verwende GKRandomSource in einer Struktur, um ein zufälliges inspirierendes Angebot in der Ansicht zurückzugeben. Gibt es eine Möglichkeit, diese Zufallszahl zurückzugeben und den vorherigen Eintrag wegzulassen? Auf diese Weise erhält der Benutzer nicht zweimal hintereinander dasselbe Zitat.Generieren von Zufallszahlen mit GKRandomSource

let inspiration = [ 
    "You are looking rather nice today, as always.", 
    "Hello gorgeous!", 
    "You rock, don't ever change!", 
    "Your hair is looking on fleek today!", 
    "That smile.", 
    "Somebody woke up on the right side of bed!"] 

func getRandomInspiration() -> String { 
    let randomNumber = GKRandomSource.sharedRandom().nextIntWithUpperBound(inspiration.count) 
    return inspiration[randomNumber] 
} 
+0

am besten eine Kopie des Arrays haben, und jedes Mal, wenn Sie einen zufälligen Index nehmen, können Sie es aus dem Array entfernen, und dann zufällig von 0 auf die neue Arrays Größe – Fonix

Antwort

2

Um zu verhindern, das gleiche Angebot zu erzeugen, verfolgt die letzten in einer struct Eigenschaft lastQuote genannt. Reduzieren Sie dann die maximale Zufallszahl um 1, und wenn Sie dasselbe wie das lastQuote generieren, verwenden Sie stattdessen max.

struct RandomQuote { 
    let inspiration = [ 
     "You are looking rather nice today, as always.", 
     "Hello gorgeous!", 
     "You rock, don't ever change!", 
     "Your hair is looking on fleek today!", 
     "That smile.", 
     "Somebody woke up on the right side of bed!"] 

    var lastQuote = 0 

    mutating func getRandomInspiration() -> String { 
     let max = inspiration.count - 1 
     // Swift 3 
     // var randomNumber = GKRandomSource.sharedRandom().nextInt(upperBound: max) 
     var randomNumber = GKRandomSource.sharedRandom().nextIntWithUpperBound(max) 
     if randomNumber == lastQuote { 
      randomNumber = max 
     } 
     lastQuote = randomNumber 
     return inspiration[randomNumber] 
    } 
} 

var rq = RandomQuote() 
for _ in 1...10 { 
    print(rq.getRandomInspiration()) 
} 
+0

Vielen Dank für die Antwort; 'für _ in 1 ... 10' kann nicht auf oberster Ebene übergeben werden. Gibt es da etwas, das ich reparieren muss? (beginnend in swift) – VegaStudios

+0

Das ist nur eine Demo, wie man die RandomQuote-Struktur verwendet. Sie können die Variable var rq = RandomQuote() als Eigenschaft einer Klasse wie ViewController und den Aufruf rq.getRandomInspiration() innerhalb einer Funktion in dieser VC hinzufügen, um ein Angebot zu erhalten. – vacawama

+0

@VegaStudios, hast du es funktioniert? – vacawama

Verwandte Themen