2012-03-28 5 views
0

У меня возникли проблемы с получением чего-то для работы в объективе c. У меня есть следующий протокол:Унаследованные свойства не работают

@protocol PFItem <NSObject> 

- (NSNumber *)weight; 
- (NSNumber *)cost; 

@end 

Этот протокол реализован в следующем классе:

@interface PFItemObject : NSObject <NSCoding, PFItem> { 
    NSString *name; 
    NSNumber *weight; 
    NSNumber *cost; 
} 

@property (retain, nonatomic) NSString *name; 
@property (retain, nonatomic) NSNumber *weight; 
@property (retain, nonatomic) NSNumber *cost; 
@property (readonly) NSString *className; 

+ (id)itemWithString:(NSString *)string; 

@end 

Теперь, это работает хорошо для меня, за исключением того, когда я использую PFItemObject как суперкласс, как так:

@interface PFWeaponObject : PFItemObject <NSCoding, PFItem> { 
    NSString *damage; 
    NSString *critical; 
    NSString *range; 
    NSNumber *attackBonus; 
    NSNumber *damageBonus; 
    WeaponTypes type; 
    BOOL isTwoHanded; 
} 

@property (retain, nonatomic) NSString *damage; 
@property (retain, nonatomic) NSString *critical; 
@property (retain, nonatomic) NSString *range; 
@property (retain, nonatomic) NSNumber *attackBonus; 
@property (retain, nonatomic) NSNumber *damageBonus; 
@property WeaponTypes type; 
@property BOOL isTwoHanded; 

+ (PFWeaponObject *)unarmedWeapon; 

@end 

+itemWithString: метод, в PFWeaponObject работает так:

+ (id)itemWithString:(NSString *)string { 
    NSArray *components = [string componentsSeparatedByString:@";"]; 
    PFWeaponObject *weapon = [[PFWeaponObject alloc] init]; 

    [weapon setName:[components objectAtIndex:0]]; 
    [weapon setWeight:[NSNumber numberWithFloat:[[components objectAtIndex:1] floatValue]]]; 
    [weapon setCost:[NSNumber numberWithInt:[[components objectAtIndex:2] intValue]]]; 
    [weapon setDamage:[components objectAtIndex:3]]; 
    [weapon setCritical:[components objectAtIndex:4]]; 
    [weapon setRange:[components objectAtIndex:5]]; 
    [weapon setType:[[components objectAtIndex:6] integerValue]]; 
    [weapon setAttackBonus:[NSNumber numberWithInt:[[components objectAtIndex:7] intValue]]]; 
    [weapon setDamageBonus:[NSNumber numberWithInt:[[components objectAtIndex:8] intValue]]]; 
    [weapon setIsTwoHanded:[[components objectAtIndex:9] boolValue]]; 

    return [weapon autorelease]; 
} 

Я предположил, что, поскольку я унаследовал от объекта PFItemObject, я должен иметь возможность присваивать значения свойствам суперкласса без проблем. Но когда я делаю следующее:

- (void)testItemCreationStrings { 
    NSString *weaponString = @"+1 Greatsword;25;2500;2d6;x3;Melee;5;1;1;YES"; 
    PFWeaponObject *sampleWeapon = [PFWeaponObject itemWithString:weaponString]; 
} 

Все свойства от суперкласса (PFItemObject) возвращают @"+1 Greatsword". Я что-то пропустил где-то, что должен был сделать?

Спасибо за любую помощь, которую вы можете предоставить, и, пожалуйста, не стесняйтесь спрашивать дополнительную информацию, если она вам нужна.

+0

Действительно ли вы переписываете свойство имени в своем реальном коде? То есть [оружие setName: [...]] вызывается три раза подряд. –

+0

Нет, я просто скопировал/вставил неправильно. Я исправил это в своем вопросе. –

+0

Возможно, вы захотите опубликовать реальный код. Предположительно, несоответствие объявления метода класса и определение метода экземпляра неверны, а стоимость - «objectAtIndex: 0». –

ответ

1

Редактировать, потому что вопрос был отредактирован. Я думаю, что у меня есть решение.

Попробуйте это:

+ (id)itemWithString:(NSString *)string { 
    NSArray *components = [string componentsSeparatedByString:@";"]; 
    PFWeaponObject *weapon = [[PFWeaponObject alloc] init]; 

    [weapon setName:[components objectAtIndex:0]]; 
    [weapon setWeight:[NSNumber numberWithInt:[[components objectAtIndex:1] intValue]]]; 
    [weapon setCost:[NSNumber numberWithInt:[[components objectAtIndex:2] intValue]]]; 
    // etc. 
    // etc. 
} 

Я думаю, вы не устанавливая поведение и формат NSNumberFormatter, и я также думаю, что использование его не нужно. Существуют и другие примеры использования форматов чисел, если вы действительно хотите сделать это по какой-то причине. Если есть причина, по которой вы хотите/нуждаетесь, я могу указать направление.

+0

Это была опечатка в вопросе, я исправил ее –

+0

Я отредактировал свой ответ, я думаю, что вижу проблему. – rosslebeau

+0

Ну, теперь я не проверял ссылку NSString, чтобы увидеть, что я могу это сделать. Спасибо за это за это (теперь мне не нужно создавать так много форматировщиков чисел, LOL). К сожалению, проблема все еще сохраняется. –

Смежные вопросы