Jakie są szczegóły "Objective-C literały" wymienione w Xcode 4.4 release notes?

Przeglądałem uwagi do wydania Xcode 4.4 i zauważyłem to:

Kompilator LLVM 4.0

Xcode zawiera teraz kompilator Apple LLVM w wersji 4.0, w tym następujące funkcje języka newObjective-C: [...]
- Objective - C literały: tworzy literały dla NSArray, NSDictionary i NSNumber, tak samo jak literały dla NSString

Zaintrygowała mnie ta funkcja. Nie do końca jest dla mnie jasne, jak literały dla NSString pracy i jak można je wykorzystać na NSArray, NSDictionary, i NSNumber. Jakie są szczegóły?
Author: Pooria Azimi, 2012-02-19

3 answers

Skopiowane dosłownie z http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and:

Objective-C literały: można teraz tworzyć literały dla NSArray, NSDictionary i NSNumber (podobnie jak można tworzyć literały dla NSString) {]}

NsArray Literały

Poprzednio:

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

Teraz:

array = @[ a, b, c ];

NSDictionary Literały

Poprzednio:

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

Teraz:

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

Nsnumber Literały

Poprzednio:

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

Teraz:

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

[Edit]

zxoq at http://news.ycombinator.com/item?id=3672744 Dodano więcej ciekawych nowych subskrypcji. (Dodano z literałami):

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

[Edytuj 2]

Nowe literały objec były omawiane na wielu sesjach WWDC 2012. I celowo nie usunąłem nazw plików i czasu każdego slajdu, abyś mógł je znaleźć dla siebie, jeśli masz ochotę. Są to zasadniczo te same rzeczy, co stwierdzono w tym poście, ale jest też kilka nowych rzeczy, które wspomnę powyżej zdjęć.

należy pamiętać, że wszystkie obrazy są duże. Po prostu przeciągnij je na inną kartę, aby wyświetlić je w oryginalnej wersji Rozmiar

Literały I Boks

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

Literały I Boks

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

Prenumerata Kolekcji

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

Prenumerata Kolekcji

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

@ # liczby, @ {} słowniki, @ "" ciągi, @ [] tablice, @ () wyrażenia


Ta część jest nowa. Literały Wyrażenia

Jeśli masz wyrażenie (M_PI / 16 na przykład), powinieneś umieścić je w nawiasie.

Ta składnia działa dla wyrażeń liczbowych, logicznych, znajdowania indeksu w łańcuchu (C), wartości logicznych, stałych enum, a nawet znaków struny!

Literały Ekspresji

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

Literały Ekspresji

NSNumber *piOverSixteen = @( M_PI / 16 );

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

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

NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );

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

Więcej o ciągach znaków i jak / kiedy można używać tej dosłownej składni:

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

Jak działa literał tablicy

Jak działają literały tablicy

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

Jak działają literały słownikowe

Jak działają literały słownikowe

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

Więcej o array subscripting

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

Więcej o prenumerata słownika

Subskrybcja Słownika

@implementation Database {
    NSMutableDictionary *_storage;
}

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

Subskrybcja Słownika

@implementation Database {
    NSMutableDictionary *_storage;
}

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

[Edytuj 3]

Mike Ash ma świetny writeup o tych nowych literałów. Jeśli chcesz dowiedzieć się więcej na ten temat, Upewnij się, że sprawdź to.


 389
Author: Pooria Azimi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-07 22:54:04

Kompilator Objective-C posiada zakodowaną na twardo wiedzę o układzie pamięci instancji klasy NSConstantString, zwanej klasą __CFConstantString. Sprawdź funkcję RewriteObjCStringLiteral w lib/Rewrite/RewriteModernObjC.cpp w kodzie źródłowym clang. Kompilator po prostu emituje dane, które pasują do układu instancji klasy NSConstantString.

Istnieje kilka możliwości dosłownych instancji NSArray i NSDictionary. Mogą zrobić coś takiego jak to, co zrobili dla ciągów literalnych - hardcode układ instancji (dla specjalnego subclass) w kompilatorze i emitują dane w tym układzie. Mogą też mieć kompilator emitujący kod, który po prostu tworzy instancję w czasie wykonywania.

 15
Author: rob mayoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-05 21:06:17

Z "Literały Objective-C"

1) NSNumber, NSDictionary i literały NSArray są dostępne w Xcode 4.4 .

2) NSDictionary i NSArray subscripting need " Xcode 4.4 and OS X 10.8 or later SDK" or " Xcode 4.5and iOS 6or later SDK"

Wygląda mi na to, że subskrypcja wymaga obsługi runtime i dlatego nie będzie działać przed iOS6.

 1
Author: Andz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-14 10:21:28