Wie erstellt man ein NSSet
von Objekten aus einem Array basierend auf einer Eigenschaft.
z.B. Ein Array von Objekten mit jeweils einem starken Verweis auf eine type
-Eigenschaft und mehrere Vorkommen jedes Typs sind im Array vorhanden. Wie kann dies in ein NSSet
umgewandelt werden, das ein einzelnes Objekt jedes Typs enthält.
Ein Wörterbuch hat diese Funktionalität im Wesentlichen bereits. Seine Schlüssel sind ein Satz, so dass Sie das Wörterbuch erstellen können, um die Objekte zu halten, die von einem beliebigen Attribut abhängig sind:
%Vor% Wenn Sie das Wörterbuch jetzt nach allValues
fragen, haben Sie nur ein Objekt für jedes Attribut. Ich sollte erwähnen, dass bei diesem Verfahren die späteren Objekte zugunsten früherer gehalten werden. Wenn die Reihenfolge Ihres ursprünglichen Arrays signifikant ist, kehren Sie es vor dem Erstellen des Wörterbuchs um.
Sie können diese Objekte nicht tatsächlich in NSSet
einfügen, da% ce_de% die Methoden NSSet
und isEqual:
der Objekte verwendet, um zu bestimmen, ob es sich um Member handelt, und nicht um das Schlüsselattribut (von Natürlich können Sie diese Methoden überschreiben, wenn dies Ihre eigene Klasse ist, aber das würde wahrscheinlich ihr Verhalten in anderen Sammlungen stören.
Wenn du wirklich das Gefühl hast, dass du ein Set brauchst, musst du deine eigene Klasse schreiben. Sie können hash
von der Unterklasse ableiten, aber die gängige Meinung ist, dass das Zusammenstellen von Cocoa-Sammlungen viel einfacher ist als das Unterklassifizieren. Im Wesentlichen schreiben Sie eine Klasse, die alle Methoden abdeckt, an denen Sie interessiert sind. Hier ist eine (ziemlich unvollständige und völlig unerprobte) Skizze:
Sie würden verwenden:
%Vor%Dies sollte unabhängig vom Typ der Objekte in Ihrem Array funktionieren und das NSSet mit nur einem Vorkommen doppelter Objekte in Ihrem Array füllen.
Ich hoffe, das hilft.
Aktualisierung: Nächstbeste Sache: Verwenden Sie zuerst die Verkettung von Klassennamen und Objekteigenschaften und dann die obige Methode.
%Vor%Ich bin nicht sicher, wofür Sie die NSSet-Ausgabe verwenden werden, aber Sie können wahrscheinlich die Verkettungselemente ändern, um die Informationen zu erhalten, die Sie in der NSSet-Ausgabe benötigen.
Ich habe eine einfache Bibliothek mit dem Namen Linq to ObjectiveC erstellt, die eine Sammlung von Methoden darstellt, die diese Art von Problem sehr stark macht einfacher zu lösen. In Ihrem Fall benötigen Sie die Methode Linq-to-Objective :
%Vor% Dies gibt eine Menge zurück, bei der jedes Element eine eigene Eigenschaft type
hat.
Tags und Links objective-c nsarray nsset