Цель C - Подклассы NSArray
Я пытаюсь подкласс NSArray
, но он вылетает из приложения при попытке получить доступ к методу подсчета. я знаю это NSArray
это кластер классов.
- Но что это значит?
- Есть ли способ обойти подкласс NSArray?
Я знаю, что я могу просто подкласс NSObject
и мой массив в качестве переменной экземпляра, но я бы предпочел подкласс NSArray
,
РЕДАКТИРОВАТЬ: Причина: я создаю карточную игру, у меня есть класс Deck
который должен подкласс NSMutableArray
иметь пару дополнительных методов (-shuffle
, -removeObjects:
, -renew
и т.д.), и я думаю, что это будет выглядеть чище для подкласса NSArray
вместо того, чтобы иметь вар.
5 ответов
Проблема с добавлением категории в такой класс заключается в том, что все экземпляры класса будут наследовать дополнительные методы. Это и не нужно (поскольку не каждый массив должен быть в состоянии перестановить и т. Д.), И опасно (потому что вы не можете извлечь выгоду из проверки типов, чтобы убедиться, что NSArray, на который вы ссылаетесь в данный момент, действительно тот, который должен был быть перетасован.).
Альтернативой может быть создание собственного класса Deck, который имеет NSMutableArray в качестве переменной экземпляра. Там вы можете определить действия в своей колоде в точности так, как вам бы хотелось, и тот факт, что вы используете NSMutableArray, становится деталью реализации. Это позволяет вам воспользоваться проверкой типов во время компиляции и изменить внутреннюю реализацию вашего класса Deck без изменения его клиентов. Например, если по какой-то причине вы решили, что NSMutableDictionary будет лучшим резервным хранилищем, вы можете внести все эти изменения в реализацию вашего класса Deck без изменения какого-либо кода, который создает и использует Deck.
Обычно вам не нужно создавать подкласс, но в любом случае Apple предлагает следующие предложения:
Любой подкласс NSArray должен переопределять примитивные методы экземпляра.
count
а такжеobjectAtIndex:
, Эти методы должны работать с резервным хранилищем, которое вы предоставляете для элементов коллекции. Для этого резервного хранилища вы можете использовать статический массив, стандартный объект NSArray или какой-либо другой тип данных или механизм. Вы также можете переопределить, частично или полностью, любой другой метод NSArray, для которого вы хотите предоставить альтернативную реализацию.
Вы на самом деле переопределить count
метод? Как говорится, вы должны предоставить собственную структуру поддержки для элементов массива и переопределить предложенные методы, учитывая это..
Если вы просто добавляете новые методы и используете существующее хранилище резервных копий, то лучшим подходом является добавление категории в NSArray. Категории являются действительно мощной частью объектива C - см. Cocoadev для некоторых образцов.
NSMutableArray
уже есть - (void)removeObjectsInArray:(NSArray *)otherArray;
Лучше всего создать подкласс NSObject со свойством изменяемого массива.
В этом конкретном случае я бы перемешал массив, используя -sortedArrayUsingComparator:
и сделать ваш компаратор случайным образом вернуть NSOrderedAscending
или же NSOrderedDescending
,
НАПРИМЕР:
NSArray *originalArray; // wherever you might get this.
NSArray *shuffledArray = [orginalArray sortedArrayUsingComparator:
^(id obj1, id obj2) {
return random() % 2 ? NSOrderedAscending : NSOrderedDescending;
}];