2017-02-16 2 views
0

Ich habe eine NSMutableDictionary sowie eine Methode zum Hinzufügen von Objekten zum Wörterbuch erstellt. Ich weiß, dass die Funktion addObject dem Wörterbuch Objekte korrekt hinzufügt, aber später, wenn ich versuche, die Objekte mit der Methode Print_Object zu drucken, wird jede einzelne Variable, die zum Objekt gehört, als null/0 gedruckt. Stimmt etwas mit meinem Code nicht?NSMutableDictionary-Objekte nicht ordnungsgemäß von Methoden zugegriffen?

-(NSMutableDictionary *)_stock{ 
    if (!_stock) { 
     _stock = [[NSMutableDictionary alloc]init]; 
    } 
    return _stock; 
} 

-(void) addObject:(NSString*) desc key: (NSString*) theKey floatrc: (float) retailcost floatwsc: (float) wholesalecost intnoh: (int) numonhand floatns: (int) numsold { 
    object_info* obj = [[object_info alloc]init]; 
    [obj setDescription: desc]; 
    [obj setRetailCost: retailcost]; 
    [obj setWholeSaleCost:wholesalecost]; 
    [obj setNumOnHand: numonhand]; 
    [obj setNumItemsSold: numsold]; 
    [self.stock setValue:obj forKey:theKey]; 
} 

-(void) Print_Object:(NSString *) theKey { 
    object_info* obj = [self.stock objectForKey:theKey]; 
    NSLog(@"Key: %@ Description: %@ Retail Cost: %f Wholesale Cost: %f Number on Hand: %i Number Sold: %i", theKey, obj.description, obj.retail_cost, obj.wholesale_cost, obj.num_on_hand, obj.num_items_sold);  
} 

Dies ist die Erklärung von object_info:

#import "object_info.h" 

@implementation object_info 

//Getters 
-(NSString *)description { 
    return description; 
} 


-(float) retail_cost { 
    return retail_cost; 
} 

-(float) wholesale_cost { 
    return wholesale_cost; 
} 

-(int) num_on_hand { 
    return num_on_hand; 
} 

-(int) num_items_sold { 
    return num_items_sold; 
} 

//Setters 
-(void)setDescription:(NSString *) value { 
    description = value; 
} 

-(void) setRetailCost: (float) n { 
    retail_cost = n; 
} 

-(void) setWholeSaleCost: (float) n { 
    wholesale_cost = n; 
} 

-(void) setNumOnHand: (int) n { 
    num_on_hand = n; 
} 

-(void) setNumItemsSold: (int) n { 
    num_items_sold = n; 
} 

@end 

Dies ist object_info.h:

#import <Foundation/Foundation.h> 

@interface object_info : NSObject 
{ 
    NSString *description; 
    float retail_cost; 
    float wholesale_cost; 
    int num_on_hand; 
    int num_items_sold; 
} 

-(NSString *)description; 
-(void)setDescription:(NSString *)value; 

-(float) retail_cost; 
-(void) setRetailCost:(float) n; 

-(float) wholesale_cost; 
-(void) setWholeSaleCost:(float) n; 

-(int) num_on_hand; 
-(void) setNumOnHand: (int) n; 

-(int) num_items_sold; 
-(void) setNumItemsSold:(int) n; 

@end 
+1

Meiner Meinung nach ist das Problem in '[self.stock setValue: obj forKey: theKey];'. Könnten Sie versuchen, 'setObject' anstelle von' setValue' zu ​​verwenden, weil Ihr obj ein Objekt ist? So '[self.stock setObject: obj forKey: theKey];' – nynohu

+0

@nynohu das funktioniert nicht. es gibt mir immer noch die gleiche Ausgabe. Ich rufe gerade die Methode in meiner Hauptfunktion mit '[newDict Print_Object: @" Galaxy Note7 "];' (mit einer Instanz der Klasse, die meine Methoden enthält) und meine Ausgabe ist: ** Key: Galaxy Note7 Beschreibung: (Null) Einzelhandelspreis: 0.000000 Großhandelspreis: 0.000000 Anzahl zur Hand: 0 Anzahl verkauft: 0 ** – user6335453

+0

können Sie Obj in Objekt hinzufügen Funktion vor dem Festlegen von Wert für das Wörterbuch –

Antwort

0

Können Sie uns zeigen, die Deklaration von stock? Ich vermute, Sie haben es als deklariert, in diesem Fall wird Ihr Versuch, -_stock als Getter zu deklarieren, unwirksam sein. Die Instanzvariable ist _stock, aber der Getter wird nur -stock sein. Wenn das eine richtige Schätzung ist, dann waren Sie auf NSLog(@"%@", self.stock) sollten Sie (null) als Ausgabe sehen - Ihre benutzerdefinierte Getter wird nicht aufgerufen, so dass kein Wörterbuch jemals erstellt wird.

Ihr Code sieht im Allgemeinen sehr altmodisch aus; insbesondere:

  1. Sie fast nie Instanz Speicher innerhalb der @interface jetzt; stecke es in die @implementation;
  2. Ihre gesamte object_info könnte als s reformuliert werden und dann müssen Sie nicht implementieren, eine Sache in diesem @implementation, lassen Sie einfach die Eigenschaften zu synthetisieren;
  3. anstatt [obj setDescription: desc];, etc, würden Sie jetzt normalerweise Verwendung von Punkt-Syntax, wie obj.description = desc;. Der Compiler wird immer noch sicherstellen, dass der richtige Setter (oder Getter) aufgerufen wird, es ist nur eine Formulierung, die weniger mentalen Kontext erfordert, was ein direktes Lesen von links nach rechts ermöglicht;
  4. der normalere Weg, um auf ein Wörterbuch zuzugreifen, ist dictionary[key] = value zu speichern und auf dictionary[key] zuzugreifen.
+0

Die Deklaration von Lager ist in der Hauptmethode meines Programms, 'NSMutableDictionary * stock = [NSMutableDictionaryWörterbuchWithDictionary: @ { }];' Ich bin derzeit ein Anfänger in iOS-Programmierung und ich versuche wirklich, auf weiter Verständnis der Grundlagen, weshalb mein Code eher altmodisch ist. – user6335453

+0

Das sieht auch falsch aus, um ehrlich zu sein. Ich denke, es funktioniert, aber ... gib es einfach @ {} direkt, oder benutze new ... das DictionaryWithDictionary ist unnötig. – ghostatron

+0

Sie verwenden 'self.stock'; Kannst du zeigen, wo du das "Lager" deklarierst? In dem von Ihnen angegebenen Code wird keine solche Eigenschaft oder kein Getter angezeigt. – Tommy

0
[self addObject:@"AAA" key:@"BBB" floatrc:100 floatwsc:200 intnoh:300 floatns:400]; 
    [self Print_Object:@"BBB"]; 

Dies funktioniert gut für mich, haben Sie den falschen Schlüssel verwenden?

[self addObject:@"AAA" key:@"BBB" floatrc:100 floatwsc:200 intnoh:300 floatns:400]; 
    [self Print_Object:@"AAA"]; 

Das geht schief, weil das Objekt null ist.

2017-02-16 10:48:34.086 Test[53298:14250944] Key: AAA Description: (null) Retail Cost: 0.000000 Wholesale Cost: 0.000000 Number on Hand: 0 Number Sold: 0 
Verwandte Themen