Коллекции iOS и странный алгоритм - PullRequest
1 голос
/ 16 февраля 2011

Итак, я хочу знать, хорошая это идея или плохая.

Я создаю простую игру для iOS (с использованием стандартных элементов управления пользовательского интерфейса), которая позволяет пользователю создавать персонажей и монстров "Шаблоны ", затем создайте Encounters, который ссылается на Персонажей и Монстров и взаимодействует с ними.

Когда пользователь создает встречу, существует простое Модальное Представление, которое позволяет ему назвать встречу, а затем нажать на другой VC, чтобы выбратьучаствующие персонажи, вернитесь назад, нажмите на второй контроллер вида, чтобы выбрать вовлеченные Шаблоны Монстров, а также сколько из этих монстров будут участвовать.

Цель, в конце концов, - получить МонстраШаблоны будут использоваться для создания «настоящих» монстров, которые будут ссылками в Encounter.

Sample Encounter
  Player Characters
    Ramza Beoulve
    Delita Hiral
  Monsters
    Orc 1
    Orc 2
    Orc 3

Для фрагмента выбора персонажа я использовал NSSet для хранения выбранных объектов персонажей и передачи их между контроллерами представления.(Таким образом, мне не нужно много возиться с контекстом управляемого объекта до фактического сохранения новой встречи)

Для монстров, так как мне нужно хранить количество и сущность, это немного большесложный.

Поэтому моя первоначальная мысль заключалась в том, чтобы сохранить их в NSArray NSDictionaries, который, в свою очередь, содержит шаблон монстров и количество.NSArray и откройте каждый отдельный словарь, чтобы проверить, существует ли конкретный шаблон монстра или нет.

Это может не иметь большого значения в этом масштабе приложения, но это кажется неэффективным.

Поэтому я подумал, что вместо этогоможет быть, лучше просто поддерживать два NSMutable Arrays

NSMutableArray *selectedMonsterTemplates;
NSMutableArray *selectedMonsterTemplateQuantities;

Таким образом, я могу просто позвонить

[selectedMonsterTemplates containsObject:monsterTemplate]; 

, когда мне нужно проверить, что-то там уже есть, и когда я добавляю иливычтя количество для конкретного монстра, я могу просто обновить оба массива.

Затем, когда встречаПосле сохранения я могу просто перебрать массив, чтобы создать отдельные экземпляры монстров в желаемом количестве и связать их с Encounter.

Я обеспокоен тем, что этот подход, хотя и простой и эффективный, может привести кпроблемы параллелизма, если в коде есть небольшая ошибка.Есть ли лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 17 февраля 2011

Может быть, лучше добавить класс, скажем, TemplateStore.(Или как вам угодно)

@interface TemplateStore : NSObject {
   MonsterTemplate *template; //Super class of a monster entity. 
   NSInteger quantity;
}

- (id) initWIthMosterTemplate:(MonsterTemplate *)temp;
- (void) increaseQuantity;
- (BOOL) isKindOfTemplate:(MonsterTemplate *)otherTemp;

@property (readonly, retain) MonsterTemplate *template;
@property NSInteger quantity;

@end

Когда вы сохраняете объект такого типа в массиве, вы можете перебирать его и использовать метод isKindOfTemplate, чтобы узнать, существует ли MonsterTemplate.Тогда просто увеличьте количество.

0 голосов
/ 17 февраля 2011

Вообще говоря, вы бы не создали массив словарей только для хранения структурированных данных, вы бы использовали один словарь с элементом (шаблоном) в качестве ключа и количеством в качестве значения.Псевдокодия будет выглядеть так:

quantity=dict[template];

Конечно, предполагается, что у вас где-то хранятся шаблоны в виде указателей.Лучшей альтернативой является использование структур:

struct monster_t { template_t t; int quantity; }

И затем вы сохраняете массив этих вещей:

monster_t[] bestiary;

Или даже лучше, найдите своего рода идентификатор (уникальное имя монстрафайл?) и держите его в словаре:

dictionary<string, monster_t> dict;
dict["big_monster_01"].quantity=5;

Конечно, эта система довольно бесполезна, количество вас не волнует.Что вас волнует, так это фактические экземпляры монстров в мире, в основном шаблоны с настраиваемыми значениями статистики попаданий, добычи и т. Д. И позицией:

struct monster_instance_t { monster_t template; vector position; }
monster_instance_t[] monsters; // who cares what they are? 
                               // that's what polymorphism is for!
...