objective-c llvm clang objective-c-literals

objective c - ¿Hay algún diccionario literal o sintaxis de matriz en Objective-C?



llvm clang (2)

Siempre ha sido posible crear NSArrays (y NSDictionaries / NSNumber) con llamadas al método vararg, como:

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

¿Se pueden crear con literales en línea en una nueva mejora de LLVM y Clang?


Con este cambio en la base de código LLVM, Apple ha agregado una nueva sintaxis para literales en las próximas versiones del compilador Clang.

Antes, las matrices se creaban usando una matriz basada en C y se convertían sobre la marcha en objetos Objective-C, tales como:

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

Tenga en cuenta que dado que este es un elemento varargs, debe proporcionar una terminación ''nil'' al final de la lista. Sin embargo, ahora hay una manera más fácil:

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

Tenga en cuenta que se requiere @ delante de [], para distinguir entre él y una matriz C ordinaria (o un mensaje de envío). Tenga en cuenta también que el ''nil'' final ya no es necesario.

Se ha realizado un cambio similar para los literales en línea del diccionario, similares a las estructuras JSON:

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

Finalmente, se ha agregado un nuevo literal para NSInteger (etc.):

NSNumber* value = @3.141;

Tenga en cuenta que, aunque esto funciona para coma flotante ( @3.141F ) y dobles ( @3.141 ), no funciona por long double ya que el compilador no los admite. Por lo tanto, @3.141D será un error en tiempo de compilación.

Debido a cómo se definen las constantes, @INT_MAX es un valor válido válido pero @INT_MIN no lo es, ya que este último se define mediante una expresión de tiempo de compilación y no un literal en sí mismo.

También hay extensiones 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]

Este cambio también ha introducido los literales __objc_yes y __objc_no para admitir el análisis sintáctico de los tipos solo a través del valor literal. Su uso está protegido con #if __has_feature(objc_bool) en el preprocesador, pero los desarrolladores deben seguir usando YES y NO en el código.

Finalmente, tanto las matrices como los diccionarios ahora se pueden suscribir con corchetes de matriz, en uso como expresiones rvalue y rvalue :

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

La subscripción de estilo de matriz (utilizando un NSUInteger ) se asigna a objectAtIndexedSubscript: y el setObject:atIndexedSubscript: correspondiente setObject:atIndexedSubscript: mientras que se accede al acceso de diccionario con objectForKeyedSubscript: y setObject:forKeyedSubscript:

La sintaxis completa de los literales se puede ver en el sitio web Clang / LLVM

Tenga en cuenta que dado que esta respuesta se escribió inicialmente, Clang ha agregado soporte para expresiones Objective-C no literales llamadas ''expresiones en caja''

Esto significa que uno puede usar @(3+4) como un equivalente a @7 , y @("Hello World") como @"Hello World" . Tenga en cuenta que una expresión C que se evalúa como null dará como resultado una excepción, y argumentos como @(null) se tratan como un error en tiempo de compilación.

También es posible usar ''enums en caja'' para tipos con un tipo conocido, por lo que

enum {Norte, Sur, Este, Oeste,};

se puede colocar en un tipo de @(North) enum con @(North) , que tendrá el valor 0 .

Las expresiones en caja estarán disponibles en clang 3.2 en adelante. Se puede probar para usar la prueba del preprocesador __has_feature(objc_boxed_expressions) .