20 Stimmen

@"" String-Typ-Literale für NSNumber

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.

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.

33voto

Adam Lockhart Punkte 1155

Da dies noch niemand erwähnt hat... Wenn Sie einen Wert in eine NSNumber einpacken müssen, ist die NSNumber Literal-Syntax wie folgt.

int val = 13;
NSNumber *numVal = @(val);

31voto

Richard Stelling Punkte 25399

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.

9voto

Tilo Prütz Punkte 1689

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.

7voto

Joe Punkte 56389

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X