objective c - @ "" Tipo de cadena literales para NSNumber
objective-c macros (4)
Me encanta el manejo abreviado de los literales de cadena en Objective C con la notación de @"string"
. ¿Hay alguna manera de obtener un comportamiento similar con NSNumber
s? [NSNumber numberWithWhatever:]
con los números más y es tan tedioso tener [NSNumber numberWithWhatever:]
llamadas a todos lados Incluso crear una macro funcionaría, pero mi conocimiento de cómo hacerlo es limitado.
A partir de Clang v3.1 ahora puedes usar los literales de Objective-C.
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]
Entonces, respondiendo a tu pregunta específica:
[Tyler setArms:[[[NSNumber alloc] initWithInt:1] autorelease]];
Ahora se puede escribir como:
[Tyler setArms:@1];
También hay literales para arrays y diccionarios, pero están más allá del alcance de esta pregunta.
Para aprovechar los literales en Xcode necesitará al menos la versión 4.4, esto viene con el compilador LLVM 4.0 de Apple.
Como nadie ha mencionado esto ... Si necesita ajustar un valor en un NSNumber, la sintaxis literal de NSNumber es la siguiente.
int val = 13;
NSNumber *numVal = @(val);
Estoy usando una macro como
#define N(x) [NSNumber numberWithInt: x]
que conduce a código como
[N(123) intValue];
actualizar:
Uno debe ser consciente del consumo de CPU y memoria de dicha macro. Mientras que las cadenas @"…"
son cadenas generadas por el compilador estático de la clase de cadena constante (¿depende de la base quizás NSConstantString
en Cocoa?) Las macros crean un código que se evalúa en tiempo de ejecución y, por lo tanto, crean un nuevo objeto cada vez que se llaman.
Xcode 4.4 ha introducido las características de Clang que rjstelling mencionó para los literales de NSNumber
, NSArray
y NSDictionary
. La sintaxis es simple:
//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