I NSArray generici possono essere realizzati eseguendo la sottoclasse NSArray
e ridefinendo tutti i metodi forniti con metodi più restrittivi. Per esempio,
- (id)objectAtIndex:(NSUInteger)index
dovrebbe essere ridefinito
@interface NSStringArray : NSArray
come
- (NSString *)objectAtIndex:(NSUInteger)index
affinché un NSArray contenga solo stringhe NSS.
La sottoclasse creata può essere utilizzata come sostituzione drop-in e offre molte funzioni utili: avvisi del compilatore, accesso alle proprietà, migliore creazione di codice e completamento in Xcode. Tutte queste sono funzioni in fase di compilazione, non è necessario ridefinire l'implementazione effettiva: i metodi di NSArray possono ancora essere utilizzati.
È possibile automatizzare questo e ridurlo a sole due affermazioni, il che lo avvicina alle lingue che supportano i generici. Ho creato un'automazione con WMGenericCollection , in cui i modelli sono forniti come macro preprocessore C.
Dopo aver importato il file di intestazione contenente la macro, è possibile creare un NSArray generico con due istruzioni: una per l'interfaccia e una per l'implementazione. Devi solo fornire il tipo di dati che desideri memorizzare e i nomi per le tue sottoclassi. WMGenericCollection fornisce tali modelli per NSArray
, NSDictionary
e NSSet
, così come le loro controparti mutevoli.
Un esempio: List<int>
potrebbe essere realizzato da una classe personalizzata chiamata NumberArray
, che viene creata con la seguente istruzione:
WMGENERICARRAY_INTERFACE(NSNumber *, // type of the value class
// generated class names
NumberArray, MutableNumberArray)
Una volta creato NumberArray
, puoi usarlo ovunque nel tuo progetto. Manca la sintassi di <int>
, ma è possibile scegliere il proprio schema di denominazione per etichettarli come classi come modelli.