Мне нравится сокращенная обработка строковых литералов в Objective C с нотой @"string"
. Есть ли способ получить подобное поведение с NSNumber
s? Я имею дело с цифрами больше, и это так утомительно, когда [NSNumber numberWithWhatever:]
звонит везде. Даже создание макроса будет работать, но мои знания о том, как это сделать, ограничены.
@"" литералы типа string для NSNumber
Ответ 1
Я использую макрос вроде
#define N(x) [NSNumber numberWithInt: x]
который приводит к коду типа
[N(123) intValue];
обновление:
Следует помнить о потреблении процессора и памяти такого макроса. В то время как строки @"…"
представляют собой static компилятор сгенерированных строк константного строкового класса (зависит от фундамента возможно NSConstantString
в Cocoa?), Макросы создают код, который оценивается во время выполнения и, следовательно, создают новый объект при каждом вызове.
Ответ 2
Начиная с Clang v3.1 теперь вы можете использовать литералы 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]
Итак, отвечая на ваш конкретный вопрос:
[Tyler setArms:[[[NSNumber alloc] initWithInt:1] autorelease]];
Теперь можно написать как:
[Tyler setArms:@1];
Существуют также литералы для массивов и словарей, но они выходят за рамки этого вопроса.
Чтобы использовать литералы в Xcode, вам понадобится хотя бы версия 4.4 - это поставляется с компилятором Apple LLVM 4.0.
Ответ 3
Так как никто не упомянул об этом... Если вам нужно обернуть значение в NSNumber, синтаксис букв NSNumber будет следующим.
int val = 13;
NSNumber *numVal = @(val);
Ответ 4
Xcode 4.4 представил функции Clang, которые rjstelling упомянул для литералов для NSNumber
, NSArray
и NSDictionary
. Синтаксис прост:
//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