@ "" литералы строкового типа для NSNumber - PullRequest
19 голосов
/ 20 сентября 2010

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

Ответы [ 4 ]

30 голосов
/ 20 июня 2012

Начиная с 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.

29 голосов
/ 09 июля 2013

Поскольку никто не упомянул об этом ... Если вам нужно обернуть значение в NSNumber, буквальный синтаксис NSNumber выглядит следующим образом.

int val = 13;
NSNumber *numVal = @(val);
11 голосов
/ 20 сентября 2010

Я использую макрос как

#define N(x) [NSNumber numberWithInt: x]

который приводит к коду типа

[N(123) intValue];

Обновление:

Нужно знать о потреблении процессора и памяти такого макроса. В то время как строки @"…" являются статическими , сгенерированными компилятором строки класса константных строк (зависит от основы, может быть, NSConstantString в Какао?), Макросы создают код, который оценивается во время выполнения, и поэтому каждый раз создают новый объект раз их называют.

7 голосов
/ 25 июля 2012

Xcode 4.4 представил функции Clang, которые упомянул для литералов для 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
...