Existe algum dictionary literal ou syntax de array em Objective-C?

Sempre foi possível criar NSArrays (e NSDictionaries / NSNumber) com chamadas de método vararg, como:

[NSArray arrayWithObjects: @"a", @"b", @"c", nil]; 

Esses podem ser criados com literais in-line em uma nova melhoria para o LLVM e o Clang?

    Com essa alteração na base de código do LLVM, a Apple adicionou uma nova syntax para literais nas próximas versões do compilador do Clang.

    Antes, as matrizes eram criadas usando uma matriz baseada em C e eram convertidas rapidamente em objects Objective-C, como:

     NSArray* array = [NSArray arrayWithObjects: @"One", @"Two", @"Three", nil]; 

    Note que como esse é um elemento varargs, você precisa fornecer um final ‘nulo’ no final da lista. No entanto, agora há uma maneira mais fácil:

     NSArray* array = @[ @"One", @"Two", @"Three" ]; 

    Observe que o líder @ antes de [] é necessário, para distinguir entre ele e um array C comum (ou um envio de mensagem). Note também que o trailing ‘nil’ não é mais necessário.

    Uma alteração semelhante foi feita para literais de dictionary em linha, semelhantes às estruturas JSON:

     NSDictionary* dict = @{ @"Key1": @"Value1", @"Key2": @"Value2", }; 

    Finalmente, um novo literal para NSInteger (etc.) foi adicionado:

     NSNumber* value = @3.141; 

    Observe que, embora isso funcione para ponto flutuante ( @3.141F ) e duplas ( @3.141 ), ele não funciona para long double s long double pois eles não são suportados para o agrupamento pelo compilador. Portanto, @3.141D será um erro em tempo de compilation.

    Devido a como as constantes são definidas, @INT_MAX é um valor válido válido, mas @INT_MIN não é, uma vez que o último é definido por meio de uma expressão em tempo de compilation e não um literal em si.

    Existem também extensões para tipos booleanos:

     NSNumber* yes = @YES; // [NSNumber numberWithBool:YES] NSNumber* no = @NO; // [NSNumber numberWithBool:NO] NSNumber* trueBool = @true; // [NSNumber numberWithBool:(BOOL)true] NSNumber* falseBool = @false; // [NSNumber numberWithBool:(BOOL)false] 

    Essa alteração também introduziu os literais __objc_no e __objc_no para suportar a análise dos tipos apenas por meio do valor literal. Seu uso é protegido com # #if __has_feature(objc_bool) no pré-processador, mas os desenvolvedores devem continuar usando YES e NO no código.

    Finalmente, as matrizes e os dictionarys agora podem ser subscritos com colchetes de matriz, em uso como expressões de lvalue e rvalue :

     NSMutableArray* stuff = ... id first = stuff[0]; stuff[0] = anotherObject; NSMutableDictionary* moreStuff = ... id conference = moreStuff[@"NSConf"] moreStuff[@"SponsoredBy"] = @"NSConfDuck" 

    O subscrito de estilo de matriz (usando um NSUInteger ) é mapeado para objectAtIndexedSubscript: e o correspondente setObject:atIndexedSubscript: enquanto o access de dictionary é acessado com objectForKeyedSubscript: e setObject:forKeyedSubscript:

    A syntax completa dos literais pode ser vista no site da Clang / LLVM

    Note que desde que esta resposta foi inicialmente escrita, Clang adicionou suporte para expressões não-literais do Objective-C chamadas ‘Expressões em Box’

    Isto significa que se pode usar @(3+4) como equivalente a @7 e @("Hello World") como @"Hello World" . Observe que uma expressão C que é avaliada como null resultará em uma exceção e argumentos como @(null) serão tratados como um erro de tempo de compilation.

    Também é possível usar “Enums em checkbox” para tipos com um tipo conhecido,

    enum {Norte, Sul, Leste, Oeste};

    pode ser colocado em um tipo de enumeração em checkbox com @(North) , que terá o valor 0 .

    Expressões em checkbox estarão disponíveis no clang 3.2 em diante. Ele pode ser testado para usar o teste de pré-processador __has_feature(objc_boxed_expressions) .

     NSNumber *intNumber1 = @42; NSArray *array1 = @[@"foo", @42, @"bar", @3.14]; NSDictionary *dictionary1 = @{ @1: @"red", @2: @"green", @3: @"blue" }; 

    Fonte: http://blog.ablepear.com/2012/02/something-wonderful-new-objective-c.html