2011-01-17 3 views
1

Ich habe über NSArrays und NSDictionaires gelesen und ich denke, dass ich das später brauche. Ich versuche, ein Objekt aus einer kleinen Datenbanktabelle zu füllen. So kann ich über eine Record-ID auf die String-Werte zugreifen. Ich muss das mehrmals machen, also macht es Sinn, es in ein Objekt zu legen.Obj-c, wie erstelle ich eine Funktion, die ein NSDictionary auffüllt und einen Wert von der Funktion erhält?

Ich habe die Grundlagen ...

- (void)viewDidLoad { 

// WORKING START 
NSMutableDictionary *dictCategories = [[NSMutableDictionary alloc] init]; 
[dictCategories setValue:@"Utility" forKey:@"3"]; 
[dictCategories setValue:@"Cash" forKey:@"5"]; 

NSString *result; 
result = [dictCategories objectForKey:@"3"]; 

NSLog(@"Result=%@", result); 
// WORKING END 

    // Can't get this bit right, current error Request for member 
    // 'getCategories' in something not a structure or union 
NSMutableDictionary *dictCategories2 = self.getCategories; 

NSLog(@"Result2=%@", [dictCategories2 objectForKey:@"5"]); 

[super viewDidLoad]; 
} 

-(NSMutableDictionary*)getCategories { 

NSMutableDictionary *dictCategories = [[NSMutableDictionary alloc] init]; 

[dictCategories setValue:@"Utility" forKey:@"3"]; 
[dictCategories setValue:@"Cash" forKey:@"5"]; 

return dictCategories; 

} 

Antwort

1

Sie die Methode falsch aufrufen, versuchen [self getCategories]

0

Sie sind nicht klar zu sein, was nicht funktioniert, aber ein paar Dinge, die offensichtlich falsch sind (JonLOo könnte aber genau richtig sein) ...

Erstens. Sie verwenden die falschen Methoden, oder zumindest gibt es eine bessere - setValue:forKey: sollte/könnte stattdessen setObject:forKey: sein. Dies könnte einer der Gründe für Ihr Problem sein.

Zweitens. Sie verteilen und verteilen nicht richtig. dictCategories2 in Ihrem viewDidLoad wird in den leeren verschwinden und bringen Sie den zugewiesenen Speicher für dictCategories in der getCategories Methode definiert. Eine einfache Standard-Lösung für dieses ist

NSMutableDictionary *dictCategories = [[NSMutableDictionary alloc] init]; 

in getCategories in

NSMutableDictionary *dictCategories = [NSMutableDictionary dictionary]; 

Es letztere Methode durch das System Autoreleased wird sich ändern.

Drittens. Sie möchten unter nachlesen. Anstelle von getFoo, setBar, verwendet der Ob-C-Standard @properties, um Setter- und Getter-Methoden zu definieren. Sie können diese dann überschreiben, um bei Bedarf Standarddaten in Ihre Methoden einzufügen. Sie möchten (wahrscheinlich) auch das Wörterbuch in Ihrer Schnittstelle als Instanzvariable speichern, anstatt es ständig zu löschen. Beispiel für eine Implementierung, die @property tut dies:

@interface foo { 
    NSMutableDictionary *ingredients; 
} 

@property (nonatomic, retain) NSMutableDictionary *ingredients; 

@end 

// .... 

@implementation foo 

@synthesize ingredients; 

// ... 

// the @synthesize command above will create getter and setter methods for us but 
// we can override them, which we need to do here 

- (NSMutableDictionary *)ingredients 
{ 
    if (ingredients != nil) { 
     // we've already got an ingredients variable so we just return it 
     return ingredients; 
    } 
    // we need to create ingredients 
    ingredients = [[NSMutableDictionary alloc] init]; 
    [ingredients setObject:@"foo" forKey:@"bar"] 
    return ingredients; 
} 

Im viewDidLoad Methode (oder anderswo, wo man ingredients vielleicht denken noch nicht initialisiert worden sind), würden Sie tun, zum Beispiel

NSMutableDictionary *dict = self.ingredients; 

Überall sonst können Sie entscheiden, nur ingredients ohne self zu verwenden, aber wenn es gleich Null ist, wird Ihre Methode nie aufgerufen werden, und Sie werden nil auf dich geworfen zu bekommen.

Dies ist in vielen Fällen nützlich und notwendig, wenn wir die Zutaten von außerhalb unserer Klasse lesen oder schreiben möchten. Es ist außerhalb dessen, worüber du fragst, aber ich habe es angesprochen, weil du versuchst, etwas ähnliches mit self.getCategories zu tun.

Hoffe, dass hilft.

Verwandte Themen