Ich bin mir nicht sicher, wie NSSets anyObject
funktioniert. Was bedeutet es, dass "Das zurückgegebene Objekt nach Belieben ausgewählt wird" (aus der NSSet Klassenreferenz )?
Wie kann ich Objekte am besten aus einem NSSet extrahieren? Ich dachte daran, allObjects
in einem Array zu bekommen und dann myArray[arc4random_uniform(x)]
, wobei x die Anzahl der Objekte im Array ist.
Gewöhnlich werden NSSet
Instanzen mit einem CFHash
Backing erstellt, also geben sie fast immer das erste Objekt in diesem Hash zurück, da es am schnellsten ist, nachzuschlagen. Der Grund, warum es sagt
Das zurückgegebene Objekt wird nach Belieben ausgewählt - die Auswahl ist nicht garantiert zufällig.
Weil Sie nicht immer wissen, dass es ein Backing-Array haben wird. Nach allem, was Sie wissen, hat die NSSet
Instanz, die Sie haben, eine NSDictionary
, die es unterstützt, oder eine andere ähnliche Datenstruktur.
Wenn Sie also ein zufälliges Objekt von einem NSSet
benötigen, verwenden Sie nicht -anyObject
, sondern stattdessen allObjects:
und mischen Sie dann das Array.
Zitat aus NSSet-Klassenreferenz :
Das zurückgegebene Objekt wird nach Belieben ausgewählt - die Auswahl ist nicht garantiert zufällig.
Konvertieren Sie für "Zufälligkeit" das NSSet
in ein NSArray
mit [theSet allObjects]
.
Wählen Sie als Nächstes ein beliebiges Objekt mit arc4random_uniform()
aus.
Die Dokumentation liest, dass anyObject
zurückgibt
Eines der Objekte in der Menge oder null, wenn die Menge keine Objekte enthält. Das Objekt, das zurückgegeben wird, wird nach dem Komfort des Sets ausgewählt - die Auswahl ist nicht garantiert, zufällig zu sein.
Höchstwahrscheinlich gibt es einen deterministischen Algorithmus bei der Arbeit.
Am zuverlässigsten wäre es, wie Sie vorschlagen, ein NSArray
mit der NSSet
Methode allObjects
zu erstellen und dann ein zufälliges Element mit arc4random() % N
auszuwählen, wobei N
das ist count
der NSArray
.
Ich benutze arc4random () und zwei veränderbare Arrays, um eine zufällige und einzigartige Menge von Objekten zu erhalten:
%Vor%Ich bin mir nicht sicher, wie effizient es für große Sammlungen sein würde, aber es funktioniert für mich mit Sammlungen, die in den unteren 100ern von Objekten nummerieren.
Tags und Links objective-c iphone ios nsset