Подтвердить что ты не робот

@"" литералы типа string для NSNumber

Мне нравится сокращенная обработка строковых литералов в Objective C с нотой @"string". Есть ли способ получить подобное поведение с NSNumber s? Я имею дело с цифрами больше, и это так утомительно, когда [NSNumber numberWithWhatever:] звонит везде. Даже создание макроса будет работать, но мои знания о том, как это сделать, ограничены.

4b9b3361

Ответ 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