Загальні NSArrays можуть бути реалізовані шляхом підкласифікації NSArray
та перевизначення всіх наданих методів з більш обмежуючими. Наприклад,
- (id)objectAtIndex:(NSUInteger)index
доведеться переглядати
@interface NSStringArray : NSArray
як
- (NSString *)objectAtIndex:(NSUInteger)index
щоб NSArray містив лише NSStrings.
Створений підклас може використовуватися як заміна, що випадає, і пропонує безліч корисних функцій: попередження компілятора, доступ до властивостей, краще створення коду та -доповнення в Xcode. Все це функції часу компіляції, не потрібно переосмислювати фактичну реалізацію - методи NSArray все ще можна використовувати.
Це можливо автоматизувати і звести до лише двох тверджень, що наближає його до мов, що підтримують дженерики. Я створив автоматизацію з WMGenericCollection , де шаблони надаються як макроси C Preprocessor C.
Після імпорту заголовкового файлу, що містить макрос, ви можете створити загальний NSArray з двома операторами: один для інтерфейсу та один для реалізації. Вам потрібно лише вказати тип даних, який ви хочете зберегти, та назви для своїх підкласів. WMGenericCollection надає такі шаблони NSArray
, NSDictionary
і NSSet
, як і їх колеги змінювані.
Приклад: List<int>
може бути реалізований за допомогою спеціального класу NumberArray
, який називається , який створюється з наступного виразу:
WMGENERICARRAY_INTERFACE(NSNumber *, // type of the value class
// generated class names
NumberArray, MutableNumberArray)
Після створення NumberArray
ви зможете використовувати його скрізь у своєму проекті. У ньому відсутній синтаксис <int>
, але ви можете вибрати власну схему іменування, щоб позначити їх як класи як шаблони.