2009-03-07 14 views
2

Vielleicht einfacher ist nicht das richtige Wort; knapp könnte es auch tun. Ich bin mir bewusst, dass Objective-C eine ausführliche Sprache ist; Ich frage mich nur, ob es so ausführlich sein muss wie in der Lösung, die ich unten zeige. Ich bin relativ neu in der Sprache.Suchen Sie nach einer einfacheren Objective-C-Lösung

Dieser Codeabschnitt zählt die Nummer jedes Feldtyps in einem Datensatz gemäß der Generierung einer UITableViewCell mit variabler Höhe, die ein Label pro Feld enthält. Meine Frage ist nicht, wie man das macht - ich habe das schon herausgefunden - ich frage mich nur: gibt es nicht einen einfacheren oder weniger verbindlichen Weg, dies in Objective-C zu tun, mit einem NSDictionary-Objekt? Ist das so kurz, wie es mit einem NSDictionary funktioniert? Lösungen, die andere Objekttypen verwenden, sind ebenfalls willkommen.

Hier ist mein -PartsRecord.countFields-Methode. Ich habe den Code etwas vereinfacht.

-(NSDictionary*) countFields { 
NSDictionary* dict = [[NSDictionary alloc] initWithObjectAndKeys: 
    @"s", [NSNumber numberWithUnsignedInt: [self.struts count]], 
    @"h", [NSNumber numberWithUnsignedInt: [self.headAssemblies count]], 
    @"l", (self.leftVent == nil) ? [NSNumber numberWithUnsignedInt: 0] : 
             [NSNumber numberWithUnsignedInt: 1], 
    @"r", (self.rightVent == nil) ? [NSNumber numberWithUnsignedInt: 0] : 
             [NSNumber numberWithUnsignedInt: 1], 
    nil ]; 
return dict; 

}

Alle Fehler in dem obigen Code sind Fehler in der Transkription, keine echten Fehler im Code.
TIA,
Howard

Antwort

3
@"l", [NSNumber numberWithUnsignedInt: self.leftVent ? 1 : 0], 
@"r", [NSNumber numberWithUnsignedInt: self.rightVent ? 1 : 0], 

wird es durch zwei Linien verkürzen

+0

Viel sauberer! Vielen Dank. Nur um zu beweisen, dass es trotz drei oder fünf Jahren in der C/C++ - Welt immer eine bessere stilistische Variation gibt, als man es gewohnt ist. – hkatz

+0

Netter Tipp und Punkte für Stil. (Ich liebe den ternären Operator.) Vergessen Sie nicht, das Speicherleck zu beheben - das ist bei weitem wichtiger als Stil. ;-) –

2

Sie auch [[NSDictionary alloc] initWithObjectsAndKeys:] zu [NSDictionary dictionaryWithObjectsAndKeys:] ändern könnte.

Dies wäre sowieso eine gute Idee, da Ihr Code eine NSDictionary zuweist, ohne sie zu veröffentlichen. -dictionaryWithObjectsAndKeys: gibt ein automatisch freigegebenes Wörterbuch zurück.

+1

Alternativ sollte die return-Anweisung in "return [dict autorelease]" geändert werden, was effektiv identisch ist, nur etwas ausführlicher. – sebnow

+0

Rechts. Ich bin gerade für die manuell freigegebene Variante gegangen, seit ich auf dem iPhone bin und 1000 dieser Dinge erzeuge. – hkatz

+0

Eigentlich wirft dies eine andere Frage auf. Ich gebe das Wörterbuch tatsächlich in der Methode frei, die dieses bezeichnet. Ist das irgendwie schlecht? – hkatz

0

-[NSNumber numberWithInt: 0] und -[NSNumber numberWithUnsignedInt: 0] sind die gleiche Anzahl (tatsächlich können sie sogar das gleiche Objekt auf einigen Implementierungen von Cocoa sein).

+0

Da sie nur 1 oder 0 enthalten, könnte numberWithBool: noch besser sein. – dreamlax

+0

Uhh gibt es nur eine "Implementierung" von Cocoa - Apples. Cocoa ist eine Implementierung von OpenStep. Ich nehme an, dass du das meintest. – sebnow

+1

Nein, ist es nicht. Das Cocoa-Framework wechselt zwischen den Mac OS x-Releases und nur einige davon (die alle die Cocoa-API implementieren) haben häufig verwendete NSNumber-Instanzen zwischengespeichert. –

3

Sofern Sie nicht beabsichtigen, die Zahlen einzugeben, ist Ihre Objektbestellung falsch. Es sollte Objekt und dann Schlüssel sein.

dict = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithUnsignedInt: [self.struts count]], @"s", 
    [NSNumber numberWithUnsignedInt: [self.headAssemblies count]], @"h", 
    [NSNumber numberWithUnsignedInt: self.leftVent ? 1 : 0], @"l", 
    [NSNumber numberWithUnsignedInt: self.rightVent ? 1 : 0], @"r", 
    nil ]; 

Auf diese Weise würde die [self.struts count] Nummer Objekt [dict objectForKey:@"s"] Aufruf zurück.

+0

guter Punkt, da ich bin ziemlich sicher Schlüssel müssen Strings sein – cobbal

+0

Schlüssel können NSObject abgeleiteten Objekt sein, wie die Werte. – dreamlax

+0

Sie haben Recht damit, dass ich die Bestellung falsch gemacht habe: Ich schreibe auf die Saiten. – hkatz

1

Muss es ein Wörterbuch sein? Wenn nicht, wäre vielleicht der Rückgriff auf ein einfaches C leichter zu verstehen.

typedef struct { 
    unsigned strutCount; 
    unsigned headAssembliesCount; 
    BOOL leftVent; 
    BOOL rightVent; 
} Fields; 


- (void) countFields:(Fields *) fields 
{ 
    fields->strutCount = [self.struts count]; 
    fields->headAssembliesCount = [self.headAssemblies count]; 
    fields->leftVent = (self.leftVent != nil); 
    fields->rightVent = (self.rightVent != nil); 
} 
0

Ich denke, dass mit Hilfe von Makros ganz in Ordnung ist Eingabe zu vereinfachen und erhöht die Lesbarkeit

#define SET_KEY_NUMBER(_key, _value) \ 
    [NSNumber numberWithUnsignedInt:_value], _key 
#define SET_KEY_BOOL(_key, _bool) \ 
    [NSNumber numberWithUnsignedInt: (_bool) ? 1 : 0], _key 

-(NSDictionary*) countFields { 
    NSDictionary* dict = [NSDictionary dictionaryWithObjectsAndKeys: 
     SET_KEY_NUMBER(@"s", [self.struts count]), 
     SET_KEY_NUMBER(@"h", [self.headAssemblies count]), 
     SET_KEY_BOOL( @"l", self.leftVent == nil), 
     SET_KEY_BOOL( @"r", self. rightVent == nil), 
     nil ]; 
    return dict; 
} 

... und @ Matt Ball ist richtig, wenn ein Objekt der Rückkehr sollte es seine Autoreleased

+0

Makro-Namen wie diese gehören in Windows-API;) – dreamlax

+0

Meiner Meinung nach macht dies nur weniger lesbar. – sebnow

+0

Mann, das tat weh, ich bin ein Mac! :) – epatel

Verwandte Themen