Wörtlich kopiert von http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and :
Objective-C-Literale: Man kann jetzt Literale für NSArray, NSDictionary und NSNumber erstellen (genau wie man Literale für NSString erstellen kann).
NSArray Literals
Vorher:
array = [NSArray arrayWithObjects:a, b, c, nil];
Jetzt:
array = @[ a, b, c ];
NSDictionary Literale
Vorher:
dict = [NSDictionary dictionaryWithObjects:@[o1, o2, o3]
forKeys:@[k1, k2, k3]];
Jetzt:
dict = @{ k1 : o1, k2 : o2, k3 : o3 };
NSNumber Literals
Vorher:
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];
Jetzt:
NSNumber *number;
number = @'X';
number = @12345;
number = @12345ul;
number = @12345ll;
number = @123.45f;
number = @123.45;
number = @YES;
[Bearbeiten]
zxoq unter http://news.ycombinator.com/item?id=3672744 hat weitere interessante neue Abonnements hinzugefügt. (Hinzugefügt mit Literalen):
arr[1] === [arr objectAtIndex:1]
dict[@"key"] === [dict objectForKey:@"key"]
[Bearbeiten 2]
Die neuen ObjC-Literale wurden in mehreren WWDC 2012- Sitzungen erörtert . Ich habe absichtlich die Dateinamen und die Uhrzeit jeder Folie nicht entfernt, damit Sie sie selbst finden können, wenn Sie Lust dazu haben. Sie sind im Wesentlichen dasselbe wie in diesem Beitrag angegeben, aber es gibt auch einige neue Dinge, die ich über den Bildern erwähnen werde.
Bitte beachten Sie, dass alle Bilder groß sind. Ziehen Sie sie einfach in eine andere Registerkarte, um sie in ihrer ursprünglichen Größe anzuzeigen
[NSNumber numberWithint:42]
[NSNumber numberWithDouble:10.8]
[NSNumber numberWithBool:YES]
[NSNumber numberWithint:6 + x * 2012]
@42
@10.8
@YES
@(6 + x * 2012)
[NSArray arrayWithObjects: a, b, c, nil]
[array objectAtIndex:i]
[NSDictionary dictionaryWithObjectsAndKeys: v1, k1, v2, k2, nil];
[dictionary valueForKey:k]
@[a, b, c]
array[i]
@{k1:v1, k2:v2}
dictionary[k]
Dieser Teil ist neu. Ausdrucksliterale
Wenn Sie einen Ausdruck haben ( M_PI / 16
zum Beispiel), sollten Sie ihn in Klammern setzen.
Diese Syntax funktioniert für numerische Ausdrücke, Boolesche Werte, das Finden eines Index in einer (C-) Zeichenfolge, Boolesche Werte, Aufzählungskonstanten und sogar Zeichenfolgen!
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")];
NSNumber *piOverSixteen = @( M_PI / 16 );
NSNumber *hexDigit = @( "0123456789ABCDEF"[i % 16] );
NSNumber *usesScreenFonts = @( [NSLayoutManager usesScreenFonts] );
NSNumber *writingDirection = @( NSWritingDirectionLeftToRight );
NSNumber *path = @( getenv("PATH") );
Weitere Informationen zu Zeichenfolgen und wie / wann Sie diese wörtliche Syntax verwenden können:
NSString *path = [NSString stringWithUTF8String: getenv("PATH")];
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
// search for a file in dir...
}
NSString *path = @( getenv("PATH") );
for (NSString *dir in [path componentsSeparatedByString: @":"]) {
// search for a file in dir...
}
Wie Array-Literale funktionieren
// 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];
Wie Wörterbuchliterale funktionieren
// 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];
Weitere Informationen zum Array-Abonnement
@implementation SongList {
NSMutableArray *_songs;
}
- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
Song *oldSong = [_songs objectAtIndex:idx];
[_songs replaceObjectAtindex:idx withObject:newSong];
return oldSong;
}
@implementation SongList {
NSMutableArray *_songs;
}
- (Song *)replaceSong:(Song *)newSong atindex:(NSUinteger)idx {
Song *oldSong = _songs[idx];
_songs[idx] = newSong;
return oldSong;
}
Weitere Informationen zum Abonnieren von Wörterbüchern
@implementation Database {
NSMutableDictionary *_storage;
}
- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
id oldObject = [_storage objectForKey:key];
[_storage setObject:object forKey:key];
return oldObject;
}
@implementation Database {
NSMutableDictionary *_storage;
}
- (id)replaceObject:(id)newObject forKey:(id <NSCopying>)key {
id oldObject = _storage[key];
_storage[key] = newObject;
return oldObject;
}
[Bearbeiten 3]
Mike Ash hat eine großartige Zusammenfassung über diese neuen Literale. Wenn Sie mehr über dieses Zeug erfahren möchten, schauen Sie es sich an .