2012-04-02 2 views
7

Ich kann einen zufälligen Wert aus einer Array-ähnlichen Struktur durch Abrufen eines zufälligen Index greifen.Wie ruft man ein zufälliges Objekt von einer NSSet-Instanz ab?

Wie kann ich einen zufälligen Wert von einem NSSet-Objekt greifen, das NSNumber-Objekte speichert? Ich konnte keine Instanzmethode von NSSet finden, die einen zufälligen Wert abruft.

+2

Verwendung '[MYSET allObjects]', die eine Reihe kehrt gehen würde und Verwenden Sie dann Ihre vorhandene Logik für einen zufälligen Index –

+0

bbum gefangen einen großen Fehler, den ich in meiner Antwort gemacht, danke. Gelöscht. – Almo

+1

Willst du zufällig, oder kümmert es dich nicht, welche? Insbesondere meine ich: "Sind Sie sich bewusst, dass' - [NSSet anyObject] '?" –

Antwort

5

Kurz gesagt, Sie können ein zufälliges Objekt nicht direkt von einem NSSet abrufen.

Sie müssen entweder das Set in ein Array verwandeln (in etwas, das einen Index hat, der randomisiert werden kann), indem Sie Ihren Code neu erstellen, um ein Array zu verwenden, oder Sie können dies mit diesem Bit Pseudocode implementieren :

Ja - es iteriert die Menge, möglicherweise die ganze Menge, wenn das Objekt gegriffen wird. Diese Iteration ist jedoch ziemlich genau das, was bei der Konvertierung in ein NSArray sowieso passieren wird. Solange das Set nicht so groß ist und man es nicht nennt, oft, keine große Sache.

+0

Die allgemeine Idee hier ist korrekt, aber ich musste sie optimieren und den Pseudocode implementieren, um kompilieren zu können . Hier ist meine Version: https://gist.github.com/4392708 – Eliot

4

Während ich mag, @bbum Antwort wird früh auf einige Fälle aufgrund der Verwendung von stop im Aufzählungsblock zu beenden.

Zur besseren Lesbarkeit und Leichtigkeit des Erinnerns, was los ist, wenn Sie diesen Code in der Zukunft wieder besuchen ich mit seinem ersten Vorschlag von turn the set into an array

NSInteger randomIndex = ..random-generator....(0 .. [set count]) 
id obj = [set count] > 0 ? [[set allObjects] objectAtIndex:randomIndex] : nil; 
Verwandte Themen