Общие NSArrays могут быть реализованы путем создания подклассов NSArray
и переопределения всех предоставленных методов с помощью более ограничительных. Например,
- (id)objectAtIndex:(NSUInteger)index
пришлось бы переопределить в
@interface NSStringArray : NSArray
в качестве
- (NSString *)objectAtIndex:(NSUInteger)index
чтобы NSArray содержал только NSStrings.
Созданный подкласс может использоваться в качестве замены и предоставляет множество полезных функций: предупреждения компилятора, доступ к свойствам, улучшенное создание кода и завершение в Xcode. Все это функции времени компиляции, нет необходимости переопределять фактическую реализацию - методы NSArray все еще можно использовать.
Это можно автоматизировать и свести к двум операторам, что приближает его к языкам, поддерживающим дженерики. Я создал автоматизацию с помощью WMGenericCollection , где шаблоны предоставляются как макросы препроцессора C.
После импорта файла заголовка, содержащего макрос, вы можете создать общий массив NSArray с двумя операторами: один для интерфейса, а другой - для реализации. Вам нужно только указать тип данных, который вы хотите сохранить, и имена для ваших подклассов. WMGenericCollection предоставляет такие шаблоны NSArray
, NSDictionary
и NSSet
, как и их коллеги изменяемые.
Пример: List<int>
может быть реализован с помощью настраиваемого класса с именем NumberArray
, который создается с помощью следующего оператора:
WMGENERICARRAY_INTERFACE(NSNumber *,
NumberArray, MutableNumberArray)
После того, как вы создали NumberArray
, вы можете использовать его везде в своем проекте. В нем отсутствует синтаксис <int>
, но вы можете выбрать свою собственную схему именования, чтобы пометить их как классы как шаблоны.