Copiato letteralmente da http://cocoaheads.tumblr.com/post/17757846453/objective-c-literals-for-nsdictionary-nsarray-and :
Letterali Objective-C: ora è possibile creare valori letterali per NSArray, NSDictionary e NSNumber (proprio come si possono creare valori letterali per NSString)
NSArray Literals
In precedenza:
array = [NSArray arrayWithObjects:a, b, c, nil];
Adesso:
array = @[ a, b, c ];
NSDictionary Literals
In precedenza:
dict = [NSDictionary dictionaryWithObjects:@[o1, o2, o3]
forKeys:@[k1, k2, k3]];
Adesso:
dict = @{ k1 : o1, k2 : o2, k3 : o3 };
NSNumber Literals
In precedenza:
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];
Adesso:
NSNumber *number;
number = @'X';
number = @12345;
number = @12345ul;
number = @12345ll;
number = @123.45f;
number = @123.45;
number = @YES;
[Modificare]
zxoq all'indirizzo http://news.ycombinator.com/item?id=3672744 ha aggiunto nuovi abbonamenti più interessanti. (Aggiunto con valori letterali):
arr[1] === [arr objectAtIndex:1]
dict[@"key"] === [dict objectForKey:@"key"]
[Modifica 2]
I nuovi letterali di ObjC sono stati discussi in più sessioni del WWDC 2012 . Non ho rimosso intenzionalmente i nomi dei file e il tempo di ogni diapositiva in modo da poterli trovare da soli se ne hai voglia. Sono essenzialmente le stesse cose dichiarate in questo post, ma ci sono anche alcune cose nuove che citerò sopra le immagini.
Si noti che le immagini sono tutte grandi. Basta trascinarli in un'altra scheda per visualizzarli nella loro dimensione originale
[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]
Questa parte è nuova. Letterature di espressioni
Quando hai un'espressione ( M_PI / 16
per esempio) dovresti metterla tra parentesi.
Questa sintassi funziona per espressioni numeriche, booleane, trovare un indice in una stringa (C-), valori booleani, costanti di enum e persino stringhe di caratteri!
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") );
Altre informazioni sulle stringhe di caratteri e su come / quando è possibile utilizzare questa sintassi letterale:
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...
}
Come funzionano i letterali array
// 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];
Come funzionano i letterali del dizionario
// 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];
Ulteriori informazioni sulla sottoscrizione di array
@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;
}
Altre informazioni sulla sottoscrizione del dizionario
@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;
}
[Modifica 3]
Mike Ash ha un grande commento su questi nuovi letterali. Se vuoi saperne di più su queste cose, assicurati di dare un'occhiata .