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