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