Generic NSArrays mogą być realizowane przez instacji NSArray
i przedefiniowania wszystkich przewidzianych metod z nich bardziej restrykcyjnych. Na przykład,
- (id)objectAtIndex:(NSUInteger)index
musiałaby być na nowo w
@interface NSStringArray : NSArray
jak
- (NSString *)objectAtIndex:(NSUInteger)index
dla NSArray zawierać tylko NSStrings.
Utworzona podklasa może być używana jako zamiennik i zapewnia wiele użytecznych funkcji: ostrzeżenia kompilatora, dostęp do właściwości, lepsze tworzenie kodu i kończenie w Xcode. Wszystko to są funkcje kompilacyjne, nie ma potrzeby redefiniować rzeczywistej implementacji - metody NSArray mogą być nadal używane.
Można zautomatyzować to i sprowadzić tylko do dwóch instrukcji, co przybliża je do języków, które obsługują generyczne. Stworzyłem automatyzację z WMGenericCollection, w której szablony są dostarczane jako makra preprocesora C.
Po zaimportowaniu pliku nagłówkowego zawierającego makro, można utworzyć ogólny NSArray z dwoma instrukcjami: jeden dla interfejsu i jeden dla implementacji. Musisz tylko podać typ danych, który chcesz przechowywać, oraz nazwy dla twoich podklas. WMGenericCollection dostarcza takie szablony dla NSArray
, NSDictionary
i NSSet
, jak również ich zmienne odpowiedniki.
przykład: List<int>
może być realizowana za pomocą niestandardowej klasy o nazwie NumberArray
, który jest tworzony z następującym stwierdzeniem:
WMGENERICARRAY_INTERFACE(NSNumber *, // type of the value class
// generated class names
NumberArray, MutableNumberArray)
Po utworzeniu NumberArray
, można go używać wszędzie w projekcie. Brakuje w nim składni <int>
, ale możesz wybrać własny schemat nazewnictwa, aby oznaczyć je jako klasy jako szablony.
Właśnie zaczynam uczyć się o ObjC. Być może możesz użyć ObjC++ do ciężkiego podnoszenia? – Toybuilder
ObjC++ nie jest tak naprawdę językiem ... po prostu sposobem na odniesienie się do zdolności ObjC do obsługi inline C++, tak samo jak w przypadku obsługi C.Nie powinieneś tego robić, chyba że musisz, (np. Jeśli potrzebujesz biblioteki innej firmy, która została napisana w C++). –
Prawie dokładny duplikat http://stackoverflow.com/questions/649483/is-there-any-way-to-enforce-typing-on-nsarray-nsmutablearray-etc –