191 votes

Quels sont les détails de la "Objective-C Littéraux" mentionné dans Xcode 4.4 notes de version?

J'ai été en passant par les notes de version de Xcode 4.4 et remarqué:

LLVM 4.0 Compilateur

Xcode comprend maintenant l'Apple LLVM Compilateur de la version 4.0, y compris les suivantes newObjective-langage C caractéristiques: [...]
- Objective-C littéraux: créer des littéraux pour NSArray, NSDictionary, et NSNumber, tout de même que les littéraux pour NSString

Je suis curieux à propos de cette fonctionnalité. Ce n'est pas tout à fait clair pour moi juste comment littéraux pour NSString de travail et comment on peut les utiliser sur d' NSArray, NSDictionary, et NSNumber.

Quels sont les détails?

394voto

Pooria Azimi Points 4964

Copié mot à mot de http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and:

Objective-C littéraux: on peut maintenant créer des littéraux pour NSArray, NSDictionary, et NSNumber (tout comme on peut créer des littéraux pour NSString)

NSArray Littéraux

Précédemment:

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

Maintenant:

array = @[ a, b, c ];

NSDictionary Littéraux

Précédemment:

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

Maintenant:

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

NSNumber Littéraux

Précédemment:

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];

Maintenant:

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

[Modifier]

zxoq à http://news.ycombinator.com/item?id=3672744 a ajouté plus intéressantes nouvelles de littéraux (ou plutôt de nouvelles utilisations de littéraux):

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

[Edit 2]

La nouvelle ObjC littéraux ont été abordés dans plusieurs WWDC 2012 sessions. J'ai volontairement de ne pas supprimer les noms de fichiers et le temps d'affichage de chaque diapositive de sorte que vous pouvez les trouver par vous-même si vous vous sentez comme. Ils sont essentiellement la même chose comme indiqué dans ce post, mais il y a aussi un peu de nouvelles choses que je vais parler ci-dessus les images.

Veuillez noter que les images sont toutes de grandes. Faites-les simplement glisser dans un autre onglet pour les voir dans leur taille d'origine

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


Cette partie est nouvelle. Expression Des Littéraux

Lorsque vous avez une expression (M_PI / 16 par exemple), vous devriez le mettre à l'intérieur de la parenthèse.

Cette syntaxe fonctionne de chiffre d'expressions, les booléens, de trouver un indice dans un (C-) chaîne de caractères, booléen, enum constantes, et même des chaînes de caractères!

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") );

Plus sur les chaînes de caractères et comment/quand vous pouvez utiliser cette syntaxe littérale:

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...
}

Comment les littéraux de tableau de travail

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];

Comment dictionnaire des littéraux de travail

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];

Plus sur les indices de tableaux

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;
}    

Plus sur dictionnaire subscripting

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;
}

[Edit 3]

Mike Ash a une grande writeup sur ces nouveaux littéraux. Si vous voulez en savoir plus sur ce genre de choses, assurez-vous de le vérifier.


15voto

rob mayoff Points 124153

L'Objective-C compilateur a codé en dur connaissance de la disposition de la mémoire des instances de l' NSConstantString classe, aka l' __CFConstantString classe. Découvrez l' RewriteObjCStringLiteral fonction lib/Rewrite/RewriteModernObjC.cpp dans le cliquetis d'un code source. Le compilateur émet simplement les données qui correspondent à la disposition des instances de l' NSConstantString classe.

Il ya un couple de possibilités pour littérale NSArray et NSDictionary des cas. Ils pourraient faire quelque chose comme ce qu'ils ont fait pour les chaînes littérales - coder en dur l'instance de mise en page (pour une sous-classe spéciale) dans le compilateur et à émettre données dans la mise en page. Ou ils pourraient avoir le compilateur émettent code qui crée simplement une instance au moment de l'exécution.

1voto

Andz Points 711

De "Objective-C Littéraux"

1) NSNumber, NSDictionary et NSArray littéraux sont disponibles dans Xcode 4.4.

2) NSDictionary et NSArray subscripting besoin "de Xcode 4.4 et OS X 10.8 ou version ultérieure SDK" ou "Xcode 4.5 et iOS 6 ou version ultérieure SDK"

Me semble que le subscripting besoins de support d'exécution et donc de ne pas travailler avant d' iOS6.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X