Os NSArrays genéricos podem ser realizados subclassificando NSArray
e redefinindo todos os métodos fornecidos com métodos mais restritivos. Por exemplo,
- (id)objectAtIndex:(NSUInteger)index
teria que ser redefinido em
@interface NSStringArray : NSArray
Como
- (NSString *)objectAtIndex:(NSUInteger)index
para que um NSArray contenha apenas NSStrings.
A subclasse criada pode ser usada como uma substituição imediata e traz muitos recursos úteis: avisos do compilador, acesso a propriedades, melhor criação de código e conclusão no Xcode. Todos esses são recursos em tempo de compilação, não há necessidade de redefinir a implementação real - os métodos do NSArray ainda podem ser usados.
É possível automatizar isso e resumir em apenas duas instruções, o que o aproxima de idiomas que suportam genéricos. Eu criei uma automação com o WMGenericCollection , onde os modelos são fornecidos como macros de pré-processador C.
Após importar o arquivo de cabeçalho que contém a macro, você pode criar um NSArray genérico com duas instruções: uma para a interface e outra para a implementação. Você só precisa fornecer o tipo de dados que deseja armazenar e nomes para suas subclasses. WMGenericCollection fornece tais modelos para NSArray
, NSDictionary
e NSSet
, assim como os seus homólogos mutáveis.
Um exemplo: List<int>
pode ser realizado por uma classe personalizada chamada NumberArray
, criada com a seguinte instrução:
WMGENERICARRAY_INTERFACE(NSNumber *, // type of the value class
// generated class names
NumberArray, MutableNumberArray)
Depois de criar NumberArray
, você pode usá-lo em qualquer lugar do seu projeto. Falta a sintaxe de <int>
, mas você pode escolher seu próprio esquema de nomenclatura para rotulá-los como classes como modelos.