180 votos

¿Cuáles son los detalles de "Objective-C literales" que se mencionan en las notas de la versión de Xcode 4.4?

Iba por las notas de la versión de Xcode 4.4 y di cuenta de esto:

LLVM Compilador 4.0

Xcode incluye ahora el Apple LLVM Compilador de la versión 4.0, incluyendo los siguientes newObjective-lenguaje C características: [...]
- Objective-C literales: crear literales para NSArray, NSDictionary, y NSNumber, de la misma manera como los literales para NSString

Estoy intrigado acerca de esta característica. No es del todo claro para mí cómo literales para NSString trabajo y de cómo se podría utilizar en NSArray, NSDictionaryy NSNumber.

¿Cuáles son los detalles?

378voto

Pooria Azimi Puntos 4964

Copia literal de http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and:

Objective-C literales: ahora se puede crear literales para NSArray, NSDictionary, y NSNumber (al igual que uno puede crear literales para NSString)

NSArray Literales

Anteriormente:

array = [NSArray arrayWithObjects:a, b, c, nil];

Ahora:

array = @[ a, b, c ];

NSDictionary Literales

Anteriormente:

dict = [NSDictionary dictionaryWithObjects:@[o1, o2, o3]
                                   forKeys:@[k1, k2, k3]];

Ahora:

dict = @{ k1 : o1, k2 : o2, k3 : o3 };

NSNumber Literales

Anteriormente:

NSNumber *number;
number = [NSNumber numberWithChar:'X'];
number = [NSNumber numberWithInt:12345];
number = [NSNumber numberWithUnsignedLong:12345ul];
number = [NSNumber numberWithLongLong:12345ll];
number = [NSNumber numberWithFloat:123.45f];
number = [NSNumber numberWithDouble:123.45];
number = [NSNumber numberWithBool:YES];

Ahora:

NSNumber *number;
number = @'X';
number = @12345;
number = @12345ul;
number = @12345ll;
number = @123.45f;
number = @123.45;
number = @YES;

[Editar]

zxoq en http://news.ycombinator.com/item?id=3672744 ha añadido más interesantes de los nuevos literales (o más bien, los nuevos usos de las literales):

arr[@1]      === [arr objectAtIndex:1]
dict[@"key"] === [dict objectForKey:@"key"]

[Edit 2]

El nuevo ObjC literales fueron discutidos en varios WWDC 2012 de las sesiones. Yo intencionalmente no quitar los nombres de archivo y el tiempo de cada diapositiva, de manera que usted puede encontrar por ti mismo si te apetece. Son esencialmente lo mismo como se indica en este post, pero también hay un par de cosas nuevas que voy a mencionar por encima de las imágenes.

Por favor, tenga en cuenta que las imágenes son todas grandes. Simplemente arrastre en otra pestaña para verlos en su tamaño original

Literals & Boxing

[NSNumber numberWithint:42]
[NSNumber numberWithDouble:10.8]
[NSNumber numberWithBool:YES]
[NSNumber numberWithint:6 + x * 2012]

Literals & Boxing

@42
@10.8
@YES
@(6 + x * 2012)

Collection Subscripting

[NSArray arrayWithObjects: a, b, c, nil]
[array objectAtIndex:i]
[NSDictionary dictionaryWithObjectsAndKeys: v1, k1, v2, k2, nil];
[dictionary valueForKey:k]

Collection Subscripting

@[a, b, c]
array[i]
@{k1:v1, k2:v2}
dictionary[k]

@# numbers, @{} dictionaries, @"" strings, @[] arrays, @() expressions


Esta parte es nueva. La Expresión De Los Literales

Cuando usted tiene una expresión (M_PI / 16 por ejemplo), usted debe poner entre paréntesis.

Esta sintaxis funciona numeral expresiones booleanas, encontrando un índice en una (C) cadena, booleano valores enum constantes, e incluso de cadenas de caracteres!

Expression Literals

NSNumber *piOverSixteen = [NSNumber numberWithDouble: (M_PI / 16)];

NSNumber *hexDigit = [NSNumber numberWithChar:"0123456789ABCDEF"[i % 16]];

NSNumber *usesScreenFonts = [NSNumber numberWithBool:[NSLayoutManager usesScreenFonts]];

NSNumber *writingDirection = [NSNumber numberWithInt:NSWritingDirectionLeftToRight];

NSNumber *path = [NSString stringWithUTF8String: getenv("PATH")];

Expression Literals

NSNumber *piOverSixteen = @( M_PI / 16 );

NSNumber *hexDigit = @( "0123456789ABCDEF"[i % 16] );

NSNumber *usesScreenFonts = @( [NSLayoutManager usesScreenFonts] );

NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );

NSNumber *path = @( getenv("PATH") );

Más información sobre cadenas de caracteres y cómo/cuándo puede utilizar esta sintaxis literal:

Boxed String Expressions

NSString *path = [NSString stringWithUTF8String: getenv("PATH")];
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
    // search for a file in dir...
}

Boxed String Expressions

NSString *path = @( getenv("PATH") );
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
    // search for a file in dir...
}

Cómo literales de matriz de trabajo

How array literals work

// when you write this:
array = @[a, b, c ];

// compiler generates:
id objects[] = { a, b, c };
NSUInteger count = sizeof(objects) / sizeof(id);
array = [NSArray arrayWithObjects:objects count:count];

Cómo diccionario literales de trabajo

How dictionary literals work

// when you write this:
dict = @{k1 : o1, k2 : o2, k3 : o3 };

// compiler generates:
id objects[] = { o1, o2, o3 };
id keys[] = { k1, k2, k3 };
NSUInteger count = sizeof(objects) / sizeof(id);
dict = [NSDictionary dictionaryWithObjects:objects
                                   forKeys:keys
                                     count:count];

Más información en la matriz de suscripción

Array Subscripting

@implementation SongList {
    NSMutableArray *_songs;
}

- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
    Song *oldSong = [_songs objectAtIndex:idx];
    [_songs replaceObjectAtindex:idx withObject:newSong];
    return oldSong;
}

Array Subscripting

@implementation SongList {
    NSMutableArray *_songs;
}

- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
    Song *oldSong = _songs[idx];
    _songs[idx] = newSong;
    return oldSong;
}    

Más información en el diccionario de suscripción

Dictionary Subscripting

@implementation Database {
    NSMutableDictionary *_storage;
}

- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
    id oldObject = [_storage objectForKey:key];
    [_storage setObject:object forKey:key];
    return oldObject;
}

Dictionary Subscripting

@implementation Database {
    NSMutableDictionary *_storage;
}

- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
    id oldObject = _storage[key];
    _storage[key] = newObject;
    return oldObject;
}

[Edición 3]

Mike Ceniza tiene una gran valoración crítica acerca de estos nuevos literales. Si quieres saber más sobre este material, asegúrese de comprobar a cabo.


15voto

rob mayoff Puntos 124153

El Objetivo-compilador de C se ha codificado el conocimiento de la memoria de diseño de instancias de la NSConstantString de la clase, también conocido como el __CFConstantString de la clase. Retirar la RewriteObjCStringLiteral función lib/Rewrite/RewriteModernObjC.cpp en el ruido de código fuente. El compilador simplemente emite de datos que coincida con el diseño de instancias de la NSConstantString de la clase.

Hay un par de posibilidades para el literal NSArray y NSDictionary de los casos. Se podría hacer algo como lo que hicieron para las cadenas literales - codificar la instancia de diseño (para un especial de la subclase) en el compilador y emitir datos en ese diseño. O podrían tener el compilador emite el código que crea una instancia en tiempo de ejecución.

1voto

Andz Puntos 711

De "Objective-C Literales"

1) NSNumber, NSDictionary y NSArray literales están disponibles en Xcode 4.4.

2) NSDictionary y NSArray suscripción necesidad "de Xcode 4.4 y OS X 10.8 o más tarde SDK" o "Xcode 4.5 y iOS 6 o posterior SDK"

A mí me parece que la suscripción de las necesidades de soporte de ejecución y, por lo tanto no trabajar antes de iOS6.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X