2012-03-28 42 views
0

Ich habe Probleme, etwas in Ziel c zu bekommen. Ich habe folgendes Protokoll:Vererbte Eigenschaften funktionieren nicht

@protocol PFItem <NSObject> 

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

@end 

Dieses Protokoll in der folgenden Klasse implementiert:

@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 

Nun, dies funktioniert gut für mich, außer wenn ich die PFItemObject als übergeordnete Klasse verwenden wie so:

@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 

Die +itemWithString: Methode, in den PFWeaponObject funktioniert wie folgt:

+ (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]; 
} 

Ich nahm an, dass ich, weil ich vom PFItemObject geerbt habe, in der Lage sein sollte, Eigenschaften der Oberklasse ohne Probleme zuzuordnen. Aber wenn ich den folgenden Code:

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

Alle Objekte aus der übergeordneten Klasse (PFItemObject) alle zurückkehren @"+1 Greatsword". Habe ich irgendwo etwas vermisst, was ich hätte tun sollen?

Vielen Dank für jede Hilfe, die Sie bieten können, und bitte zögern Sie nicht, für weitere Informationen zu fragen, wenn Sie es brauchen.

+0

Überschreiben Sie wirklich die Eigenschaft name in Ihrem echten Code? Das heißt, [waffe setName: [...]] wird dreimal hintereinander aufgerufen. –

+0

Nein, ich habe nur falsch kopiert/eingefügt. Ich habe es in meiner Frage korrigiert. –

+0

Sie könnten echten Code veröffentlichen. Vermutlich ist die Nichtübereinstimmung einer Deklaration einer Klassenmethode und einer Instanzmethode falsch, und die Kosten sind "objectAtIndex: 0". –

Antwort

1

Bearbeiten, weil die Frage bearbeitet wurde. Ich denke, ich habe eine Lösung.

Try this:

+ (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. 
} 

Ich glaube, Sie sind nicht auf das Verhalten und das Format der NSNumberFormatter Einstellung, und ich denke auch, dass es nicht notwendig ist, verwenden. Es gibt andere Beispiele für die Verwendung von Zahlenformatiern, wenn Sie dies aus irgendeinem Grund wirklich tun möchten. Wenn es einen Grund gibt, den Sie wollen/müssen, kann ich Richtung geben.

+0

das war ein Tippfehler in der Frage, ich habe es korrigiert –

+0

Ich bearbeitete meine Antwort, ich denke, ich sehe das Problem. – rosslebeau

+0

Nun, ich habe den NSString-Verweis nicht überprüft, um zu sehen, dass ich das tun könnte. Vielen Dank dafür (jetzt muss ich nicht so viele Zahlenformatierer erstellen, lol). Leider besteht das Problem immer noch. –

Verwandte Themen