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?
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 double
s, 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:
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)
.
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
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