Вопрос

Я пытаюсь подкласс 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;
     }];
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top