Wenn Sie mit objectAtIndex: kein Objekt von einem NSSet erhalten können, wie können Sie dann Objekte abrufen?
objective-c
cocoa
cocoa-touch
object
nsset
Knoten Ninja
quelle
quelle
[[nsSetObjects allObjects] objectAtIndex: anyInteger]
Antworten:
Es gibt mehrere Anwendungsfälle für einen Satz. Sie können mit (z. B. mit
enumerateObjectsUsingBlock
oder NSFastEnumeration) auflisten, aufrufencontainsObject
, um die Mitgliedschaft zu testenanyObject
, ein Mitglied (nicht zufällig) abrufen oder es mit in ein Array (in keiner bestimmten Reihenfolge) konvertierenallObjects
.Ein Set ist geeignet, wenn Sie keine Duplikate möchten, sich nicht um die Reihenfolge kümmern und schnelle Mitgliedschaftstests wünschen.
quelle
member:
Nachricht senden . Wenn es zurückkehrtnil
, enthält die Menge kein Objekt, das dem Objekt entspricht, das Sie übergeben haben. Wenn ein Objektzeiger zurückgegeben wird, bezieht sich der zurückgegebene Zeiger auf das Objekt, das sich bereits in der Menge befindet. Die Objekte in der Menge implementieren musshash
undisEqual:
für diese nützlich sein.hash
Bedürfnisse umgesetzt werden; es würde einfach viel schneller gehen, wenn du das tust.hash
im NSObject-Protokoll: „Wenn zwei Objekte gleich sind (wie von derisEqual:
Methode bestimmt), müssen sie denselben Hashwert haben.“ Derzeit implementierthash
undisEqual:
verwendet NSObject die Identität (Adresse) des Objekts. Wenn Sie überschreibenisEqual:
, richten Sie die Möglichkeit von Objekten ein, die nicht identisch, aber gleich sind. Wenn Sie nicht auch überschreibenhash
, werden immer noch unterschiedliche Hashes angezeigt. Dies verstößt gegen die Anforderung, dass gleiche Objekte gleiche Hashes haben.member:
wird der Container nur in diesem angezeigt Bucket (weshalb Sets beim Testen der Mitgliedschaft so viel schneller sind als Arrays und Wörterbücher beim Nachschlagen von Schlüsselwerten so viel schneller als parallele Arrays). Wenn das gesuchte Objekt den falschen Hash hat, sucht der Container im falschen Eimer und findet keine Übereinstimmung.-[NSObject hash]
0 war. Das erklärt viel. = SNSSet hat keine Methode objectAtIndex:
Versuchen Sie, allObjects aufzurufen, das ein NSArray aller Objekte zurückgibt.
quelle
Es ist möglich, filteredSetUsingPredicate zu verwenden, wenn Sie eine eindeutige Kennung zur Auswahl des gewünschten Objekts haben.
Erstellen Sie zuerst das Prädikat (vorausgesetzt, Ihre eindeutige ID im Objekt heißt "Bezeichner" und ist ein NSString):
Wählen Sie dann das Objekt mit dem Prädikat aus:
quelle
NSArray *myArray = [myNSSet allObjects];
Ersetzen Sie NSUInteger durch den Index Ihres gewünschten Objekts.
quelle
Für Swift3 und iOS10:
quelle
NSSet verwendet die Methode isEqual: (die Objekte, die Sie in diesen Satz einfügen, müssen zusätzlich die Hash-Methode überschreiben), um festzustellen, ob sich ein Objekt darin befindet.
Wenn Sie beispielsweise ein Datenmodell haben, das seine Eindeutigkeit durch einen ID-Wert definiert (sagen wir, die Eigenschaft lautet:
dann würden Sie isEqual: as implementieren
und Sie könnten Hash implementieren:
Anschließend können Sie ein Objekt mit dieser ID abrufen (und prüfen, ob es sich im NSSet befindet) mit:
Aber ja, der einzige Weg, etwas aus einem NSSet herauszuholen, besteht darin, das zu berücksichtigen, was seine Einzigartigkeit überhaupt definiert.
Ich habe nicht getestet, was schneller ist, aber ich vermeide die Verwendung von Aufzählungen, da dies linear sein könnte, während die Verwendung der member: -Methode viel schneller wäre. Dies ist einer der Gründe, die Verwendung von NSSet anstelle von NSArray zu bevorzugen.
quelle
quelle
Meistens ist es Ihnen egal, ob Sie ein bestimmtes Objekt aus einem Set abrufen. Sie möchten testen, ob ein Satz ein Objekt enthält. Dafür sind Sets gut. Wenn Sie sehen möchten, ob sich ein Objekt in einer Sammlung befindet, sind Sätze viel schneller als Arrays.
Wenn Sie sich nicht darum kümmern, welches Objekt Sie erhalten, verwenden Sie das,
-anyObject
das Ihnen nur ein Objekt aus dem Set gibt, z. B. Ihre Hand in eine Tasche stecken und etwas greifen.Wenn Sie sich für das Objekt interessieren, das Sie erhalten, verwenden
-member
Sie, um das Objekt zurückzugeben, oder null, wenn es nicht im Set enthalten ist. Sie müssen das Objekt bereits haben, bevor Sie es aufrufen.Hier ist ein Code, den Sie in Xcode ausführen können, um mehr zu verstehen
quelle