Generische NSArrays können durch Unterklassen NSArray
und Neudefinition aller bereitgestellten Methoden mit restriktiveren Methoden realisiert werden. Beispielsweise,
- (id)objectAtIndex:(NSUInteger)index
müsste neu definiert werden in
@interface NSStringArray : NSArray
wie
- (NSString *)objectAtIndex:(NSUInteger)index
für ein NSArray, das nur NSStrings enthält.
Die erstellte Unterklasse kann als Drop-In-Ersatz verwendet werden und bietet viele nützliche Funktionen: Compiler-Warnungen, Eigenschaftszugriff, bessere Codeerstellung und -vervollständigung in Xcode. All dies sind Funktionen zur Kompilierungszeit. Die eigentliche Implementierung muss nicht neu definiert werden. Die Methoden von NSArray können weiterhin verwendet werden.
Es ist möglich, dies zu automatisieren und auf nur zwei Anweisungen zu reduzieren, wodurch es Sprachen nahe kommt, die Generika unterstützen. Ich habe mit WMGenericCollection eine Automatisierung erstellt , bei der Vorlagen als C-Präprozessor-Makros bereitgestellt werden.
Nach dem Importieren der Header-Datei, die das Makro enthält, können Sie ein generisches NSArray mit zwei Anweisungen erstellen: eine für die Schnittstelle und eine für die Implementierung. Sie müssen nur den Datentyp, den Sie speichern möchten, und die Namen für Ihre Unterklassen angeben. WMGenericCollection stellt solche Vorlagen für NSArray
, NSDictionary
und NSSet
, sowie deren wandelbar Pendants.
Ein Beispiel: List<int>
könnte durch eine benutzerdefinierte Klasse namens aufgerufen werden NumberArray
, die mit der folgenden Anweisung erstellt wird:
WMGENERICARRAY_INTERFACE(NSNumber *, // type of the value class
// generated class names
NumberArray, MutableNumberArray)
Sobald Sie erstellt haben NumberArray
, können Sie es überall in Ihrem Projekt verwenden. Es fehlt die Syntax von <int>
, aber Sie können Ihr eigenes Namensschema auswählen, um diese als Klassen als Vorlagen zu kennzeichnen.