Czy jest jakiś dosłowny słownik lub składnia tablicy w Objective-C?

Zawsze możliwe było tworzenie NSArrays (i NSDictionaries/NSNumber) za pomocą wywołań metody vararg, takich jak:

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

Czy można je tworzyć z literałami in-line w nowym ulepszeniu LLVM i Clang?

Author: Josh Caswell, 2012-03-14

2 answers

Wraz z ta zmiana do bazy kodowej LLVM, Apple dodał nową składnię liter w nadchodzących wersjach kompilatora Clang.

Wcześniej tablice były tworzone przy użyciu tablicy opartej na C i były konwertowane w locie do obiektów Objective - C, takich jak:

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

Zauważ, że ponieważ jest to element varargs, musisz podać końcówkę " nil " na końcu listy. Jednak teraz jest łatwiejszy sposób: {]}

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

Zauważ, że wiodący @ przed [] jest wymagane, aby odróżnić ją od zwykłej tablicy C (lub wysłanej wiadomości). Należy również zauważyć, że końcowe " nil " nie jest już wymagane.

Podobnie jak w przypadku słowników liniowych, podobne do struktur JSON zostały wprowadzone zmiany:]}
NSDictionary* dict = @{
    @"Key1": @"Value1",
    @"Key2": @"Value2",
};

Wreszcie, nowy literał dla NSInteger (etc. dodano:

NSNumber* value = @3.141;

Zauważ, że chociaż działa to dla zmiennoprzecinkowych (@3.141F) i podwajających (@3.141), to nie działa dla long doubles, ponieważ nie są one obsługiwane do owijania przez kompilator. Tak więc, @3.141D będzie błędem w czasie kompilacji.

Ze względu na sposób definiowania stałych, @INT_MAX jest poprawną poprawną wartością, ale @INT_MIN nie jest, ponieważ ta ostatnia jest zdefiniowana przez wyrażenie w czasie kompilacji, a nie literał sam w sobie.

Istnieją również rozszerzenia typów boolean:

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]

Ta zmiana wprowadziła również literały __objc_yes i __objc_no do obsługi parsowania typów tylko poprzez wartość literałową. Ich użycie jest strzeżone #if __has_feature(objc_bool) w preprocesorze, ale programiści powinni nadal używać YES i NO w kodzie.

Wreszcie, zarówno tablice, jak i słowniki mogą być opatrzone nawiasami tablic, w użyciu zarówno jako lvalue, jak i rvalue wyrażenia:

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

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

Subskrypcja w stylu tablicy (za pomocą NSUInteger) jest mapowana na objectAtIndexedSubscript: i odpowiadające im setObject:atIndexedSubscript:, podczas gdy dostęp do słownika jest dostępny za pomocą objectForKeyedSubscript: i setObject:forKeyedSubscript:

Na stronie internetowej Clang/LLVM znajduje się pełna składnia literałów.]}

Uwaga ponieważ odpowiedź ta została pierwotnie napisana, Clang dodał wsparcie dla nie dosłownych wyrażeń Objective-C zwanych "wyrażeniami Pudełkowymi" [36]}

Oznacza to, że można użyć @(3+4) jako odpowiednika @7, A @("Hello World") jako @"Hello World". Zauważ, że wyrażenie C, które zwraca null spowoduje wyjątek, a argumenty takie jak {[29] } są traktowane jako błąd w czasie kompilacji.

Możliwe jest również użycie 'enumów pudełkowych' dla typów o znanym typie, więc

Enum { Północ, Południe, Wschód, Zachód, };

Może być umieszczony w polu typu enum z @(North), który będzie miał wartość 0.

Wyrażenia pudełkowe będą dostępne w clang 3.2 począwszy. Można go przetestować za pomocą testu preprocesora __has_feature(objc_boxed_expressions).

 92
Author: AlBlue,
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-06-23 18:10:26
NSNumber *intNumber1 = @42;
NSArray *array1 = @[@"foo", @42, @"bar", @3.14];
NSDictionary *dictionary1 = @{ @1: @"red", @2: @"green", @3: @"blue" };

Źródło: http://blog.ablepear.com/2012/02/something-wonderful-new-objective-c.html

 5
Author: joerick,
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-03-13 23:18:51