Строительные конструкторы для ролевых игр в Objective C - PullRequest
1 голос
/ 29 сентября 2010

У меня есть character класс модели, который имеет такую ​​структуру:

@interface CharacterModel : NSObject 
{
    // parent of this character
    CharacterModel *parentChar;

    // basic details
    NSString *fname, *sname, *nick;
    NSString *char_type; // categories of characters: dwarf, etc

    // health
    int health;

    // cash
    double cash;
    double graft;

    // flags
    bool is_cop, is_player, is_ai, is_playable;

    // Skills
    int skill_speed;
    int skill_stamina;
    int skill_aggr;
    int skill_another;
    int skill_somethingelse;
    // Total = 100

    // Hidden RPG skills
    int corruption;
    int greed;

    // Rep skills
    int reputation;

    // Misc. flags
    int active, picked, is_locked;
}

Проблема в 2 вещах.

1) Мне нужно переписать эту структуру в @property (nonotomic) ... части файла .h, и мне нужно сделать это снова для @synthesize части файла .m

Есть ли способ уменьшить необходимость переписывать вещи; Могу ли я поместить все это в структуру или что-то еще, а затем просто @synthesize это?

2) Конструктор будет иметь тупо длинное имя функции.

Я действительно, очень не хочу писать конструктор, который имеет сотни переменных / полей.

т

-(id)initCharacter:(NSString *)name, and every other class variable mentioned above ...

Есть ли способ обойти это?

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

Любая помощь по этому вопросу будет отличной.

Спасибо

Ответы [ 2 ]

3 голосов
/ 29 сентября 2010

Я действительно думаю, что вы должны сделать свой дизайн еще дальше.Это очень негибко, чтобы четко определить все навыки и флаги, как это.Попробуйте создать новые классы с именем:

  • Умение
  • Атрибут
  • Флаг

Ваш класс персонажа при этом будет иметь:

NSMutableArray* skills;
NSMutableArray* attributes;
NSMUtableArray* flags;

и, очевидно, методы getter / setters и add / remove для каждого из них.

Мало того, что это сделает ваш класс более аккуратным, но и сэкономит вам много печатания.

0 голосов
/ 29 сентября 2010

Если вы можете использовать современную среду выполнения Objective C (доступную на iPhone и для 64-битных программ OS X), вам придется написать определения свойств дважды.Просто напишите части @property и @synthesize, переменные экземпляра будут созданы автоматически.Если вам нужно поддерживать старую среду выполнения, вам просто нужно написать ее три раза, с этим ничего не поделаешь.

В конструктор, вероятно, не следует передавать значения для каждого свойства.Инициализируйте их для некоторых разумных значений по умолчанию.Обратите внимание, что вам не нужно ничего делать, если значение по умолчанию равно 0, 0.0, nil или NULL - alloc гарантирует, что все ивары инициализированы равными нулю.из NSDictionary вы можете использовать кодирование значения ключа, чтобы установить их, вместо того, чтобы делать это вручную:

for (NSString *key in dictionary) {
    id value = [dictionary objectForKey: key];
    [self setValue: value forKey: key];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...