Generyczne NSArrays można zrealizować przez podklasy NSArray
i przedefiniowanie wszystkich dostarczonych metod na bardziej restrykcyjne. Na przykład,
- (id)objectAtIndex:(NSUInteger)index
musiałby zostać przedefiniowany w
@interface NSStringArray : NSArray
tak jak
- (NSString *)objectAtIndex:(NSUInteger)index
aby NSArray zawierał tylko NSStrings.
Utworzona podklasa może być używana jako zamiennik typu drop-in i zapewnia wiele przydatnych funkcji: ostrzeżenia kompilatora, dostęp do właściwości, lepsze tworzenie kodu i -kompletność w Xcode. Wszystkie te funkcje są dostępne w czasie kompilacji, nie ma potrzeby ponownego definiowania rzeczywistej implementacji - nadal można używać metod NSArray.
Można to zautomatyzować i sprowadzić tylko do dwóch instrukcji, co zbliża to do języków obsługujących typy generyczne. Stworzyłem automatyzację za pomocą WMGenericCollection , w której szablony są dostarczane jako makra C Preprocessor.
Po zaimportowaniu pliku nagłówkowego zawierającego makro, można utworzyć ogólny NSArray z dwoma instrukcjami: jedną dla interfejsu i jedną dla implementacji. Musisz tylko podać typ danych, które chcesz przechowywać, i nazwy podklas. WMGenericCollection dostarcza takich szablonów NSArray
, NSDictionary
a NSSet
, jak również ich Zmienne odpowiedniki.
Przykład: List<int>
może być zrealizowany przez niestandardową klasę o nazwie NumberArray
, która jest tworzona za pomocą następującej instrukcji:
WMGENERICARRAY_INTERFACE(NSNumber *, // type of the value class
// generated class names
NumberArray, MutableNumberArray)
Po utworzeniu NumberArray
możesz go używać w całym projekcie. Brakuje składni <int>
, ale możesz wybrać własny schemat nazewnictwa, aby oznaczyć je jako klasy jako szablony.