2012-03-13 14 views

Respuesta

88

Con this change a la base de código LLVM, Apple ha añadido una nueva sintaxis de literales en las próximas versiones del compilador Clang.

Antes, arreglos fueron creados usando una matriz basada en C y se convirtieron en la marcha en objetos Objective-C, tales como:

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

Tenga en cuenta que al tratarse de un elemento de varargs, que tenía que suministrar 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 el principal @ antes de la [] se requiere, para distinguir entre ella y un arsenal y C ordinaria (o un envío de mensaje). Tenga en cuenta también que el 'nil' final ya no es necesario.

Un cambio similar se ha hecho para los literales en línea diccionario, similares a las estructuras JSON: se ha agregado

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

Por último, un nuevo literales 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 para long double s, 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 en tiempo de compilación y no es un literal en sí mismo.

También hay extensiones a 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 el __objc_yes y __objc_no literales para apoyar el análisis de los tipos a través de valor literal solamente. Su uso está protegido con #if __has_feature(objc_bool) en el preprocesador, pero los desarrolladores deben continuar utilizando YES y NO en el código.

Finalmente, ambas matrices y los diccionarios se pueden ahora indexan mediante soportes de matriz, en uso tanto como lvalue y rvalue expresiones:

NSMutableArray* stuff = ... 
id first = stuff[0]; 
stuff[0] = anotherObject; 

NSMutableDictionary* moreStuff = ... 
id conference = moreStuff[@"NSConf"] 
moreStuff[@"SponsoredBy"] = @"NSConfDuck" 

El subscripting estilo array (usando un NSUInteger) está asignada a objectAtIndexedSubscript: y la correspondiente setObject:atIndexedSubscript:, mientras se accede al diccionario con acceso objectForKeyedSubscript: y setObject:forKeyedSubscript:

la sintaxis completa para los literales se puede ver en la Clang/LLVM website

Nota que desde esta respuesta fue escrito inicialmente, Clang ha añadido soporte para expresiones de Objective-C no literales llamada 'expresiones en caja'

Esto significa que se puede utilizar @(3+4) como un equivalente a @7 y @("Hello World") como @"Hello World". Tenga en cuenta que una expresión C que evalúa a 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 utilizar enumeraciones 'encajonados' para este tipo con un tipo conocido, por lo

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

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

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

+2

Awesome news - thanks for sharing! – Till

+0

Ahora también hay expresiones autoboxed, que se creó después de que esta respuesta se publicó por primera vez. He enmendado la lista anterior para incluir algunos ejemplos de eso. – AlBlue

+2

Debo decir que '@ nil' sería bueno para' NSNull'. – Joe

Cuestiones relacionadas