Ich liebe die Kurzhandbehandlung von String-Literalen in Objective C mit der @"string"
Notation. Gibt es eine Möglichkeit, ein ähnliches Verhalten mit NSNumber
s? Ich habe mehr mit Zahlen zu tun und es ist so mühsam, mit [NSNumber numberWithWhatever:]
Anrufe überall. Sogar die Erstellung eines Makros würde funktionieren, aber ich weiß nicht genau, wie man das am besten macht.
Antworten
Zu viele Anzeigen?Ab dem Clang v3.1 können Sie jetzt Objective-C-Literale verwenden.
NSNumber *fortyTwo = @42; // equivalent to [NSNumber numberWithInt:42]
NSNumber *fortyTwoUnsigned = @42U; // equivalent to [NSNumber numberWithUnsignedInt:42U]
NSNumber *fortyTwoLong = @42L; // equivalent to [NSNumber numberWithLong:42L]
NSNumber *fortyTwoLongLong = @42LL; // equivalent to [NSNumber numberWithLongLong:42LL]
Um Ihre konkrete Frage zu beantworten:
[Tyler setArms:[[[NSNumber alloc] initWithInt:1] autorelease]];
Kann nun geschrieben werden als:
[Tyler setArms:@1];
Es gibt auch Literale für Arrays und Dictionaries, aber das würde den Rahmen dieser Frage sprengen.
Um die Vorteile von Literalen in Xcode zu nutzen, benötigen Sie mindestens die Version 4.4, die mit Apples LLVM 4.0 Compiler ausgeliefert wird.
Ich verwende ein Makro wie
#define N(x) [NSNumber numberWithInt: x]
was zu Code führt wie
[N(123) intValue];
aktualisieren:
Man sollte sich des CPU- und Speicherverbrauchs eines solchen Makros bewusst sein. Während die @"…"
Zeichenketten sind statisch vom Compiler erzeugte Zeichenketten der Klasse der konstanten Zeichenketten (abhängig von der Grundlage vielleicht NSConstantString
in Cocoa?) erstellen die Makros Code, der zur Laufzeit ausgewertet wird, und erzeugen daher bei jedem Aufruf ein neues Objekt.
Xcode 4.4 hat die Clang-Funktionen eingeführt, die rjstelling erwähnt für Literale für NSNumber
, NSArray
y NSDictionary
. Die Syntax ist einfach:
//Number literal
NSNumber *pi = @3.14;
//Array literal
NSArray *primes = @[ @2, @3, @5, @7, @11 ]; //No nil terminator needed
//Dictionary literal
NSDictionary *dict = @{
@"key1": @42,
@"key2": @"Another key",
@3: @"A NSNumber key"
}; //No nil terminator, stored in "key:value," format
0 Stimmen
Wie von rjstelling hervorgehoben, ist dies nun eine Funktion in Clang. Großer Jubel. Bitte stimmen Sie für die Schließung, danke.
0 Stimmen
Es gibt keinen Grund, dies zu schließen. Es ist eine völlig berechtigte Frage. Die Schließung ist für unerwünschte Fragen, bei denen Antworten verhindert werden müssen.
1 Stimmen
Sie sollten aber stattdessen die Antwort von @rjstelling akzeptieren, da sie jetzt korrekter ist.
0 Stimmen
Hmm, ich frage mich, wie die SO das sieht. Tilo hat die Frage so beantwortet, wie sie damals war, also scheint es ein bisschen unfair, sie einer anderen Person zuzusprechen, nachdem sich die Fakten geändert haben. Das wäre so, als würde man von Neumann abwerten, weil er die Multicore-Technik nicht vorausgesehen hat oder so. Mit 1542 Aufrufen in drei Jahren wird diese Frage nicht einmal besonders häufig gestellt. Außerdem denke ich, dass Tilos Antwort und JeremyPs Verbesserungen immer noch für jemanden nützlich sein könnten, der vielleicht nach Umgehungen für die NSSet-Literal-Syntax oder die NSMutableArray-Literal-Syntax sucht, auch wenn es unwahrscheinlich ist, dass sie hier auftauchen und in diese Richtung gehen.