Apple LLVM Compiler 4.0提供了新的object literal語法。
這篇文章會跟大家分享這新功能,讓在撰寫Objective-C時能夠有效率。
也讓Objective-C看起來更貼近開發人員啦!
在Objective-C中,最常被使用的object literal為
NSString *myString = @"Thousand Squared";
在上述的例子中,@"Thousand Squared"為一個object literal,用來代表一個NSString object。如果不使用object literal的話,程式碼會長的很不一樣。
NSString *myString = [NSString stringWithUTF8String:"Thousand Squared"];
很明顯的可以知道,第一種寫法是比較好讀,也比較好寫的。
而新的Apple LLVM Compiler 4.0,增加了額外的object literal。
包含NSNumber object, NSArray object, NSDictionary object
NSNumber Literals
以NSNumber為例:
以下程式碼為傳統的Objective-C寫法:
NSNumber *boolYES = [NSNumber numberWithBool:YES];
NSNumber *boolNO = [NSNumber numberWithBool:NO];
NSNumber *charX = [NSNumber numberWithChar:'X'];
NSNumber *fortySevenInt = [NSNumber numberWithInt:47];
NSNumber *fortySevenUnsigned = [NSNumber numberWithUnsignedInt:47U];
NSNumber *fortySevenLong = [NSNumber numberWithLong:47L];
NSNumber *goldenRatioFloat = [NSNumber numberWithFloat:1.61803F];
NSNumber *goldenRatioDouble = [NSNumber numberWithDouble:1.61803];
現在,我們可以用object literals改寫成:
NSNumber *boolYES = @YES;
NSNumber *boolNO = @NO;
NSNumber *charX = @'X';
NSNumber *fortySevenInt = @47;
NSNumber *fortySevenUnsigned = @47U;
NSNumber *fortySevenLong = @47L;
NSNumber *goldenRatioFloat = @1.61803F;
NSNumber *goldenRatioDouble = @1.61803;
是不是簡單多了呢!
Objective-C Collection Literals
Collection literal對objective-c來說真是不可思意的好用呀!新的LLVM Compiler有提供Array與Dictionary的collection listral,要注意的是,沒有包含sets。
NSArray Literals
傳統的語法建立NSArray:
NSArray *instruments = [NSArray arrayWithObjects: @"Ocarina", @"Flute", @"Harp", nil];
利用新的object literal方法建立NSArray:
NSArray *instruments = @[ @"Ocarina", @"Flute", @"Harp" ];
很可惜的是,上述語法並不支援NSMutableArray,但是我們可以利用一些小撇步來建立NSMutableArray:
NSMutableArray *instrumentsMutable = [ @[ @"Ocarina", @"Flute", @"Harp" ] mutableCopy];
Dictionary Literals
傳統語法建立NSDictionary object:
NSArray *keys = [NSArray arrayWithObjects:@"Character", @"Weapon", @"Hitpoints", nil];
NSArray *objects = [NSArray arrayWithObjects:@"Zelda", @"Sword", [NSNumber numberWithInt:50], nil];
NSDictionary *stats = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
或者,可以更簡單一點:
NSDictionary *stats = [NSDictionary dictionaryWithObjectsAndKeys:
@"Zelda", @"Character",
@"Sword", @"Weapon",
[NSNumber numberWithInt:50], @"Hitpoints",
nil];
有了新的object literal之後,一切變得更簡單:
NSDictionary *stats = @{ @"Character" : @"Zelda",
@"Weapon" : @"Sword",
@"Hitpoints" : @50};
Collection Subscripting
除了利用object literal建立collection object之外,新的LLVM Compiler也提供存取collection object的方法─利用subscripts。
傳統的語法如下:
NSString *instrument = [instruments objectAtIndex:0];
NSString *name = [stats objectForKey:@"Character"];
現在,利用新的subscripts存取collection:
NSString *instrument = instruments[0];
NSString *name = stats[@"Character"];
除此之外,subscripting不只只有取出資料而已,如果你的collection為mutable的型態,你也可以用它來改變元素內容。
instrumentsMutable[0] = @"Ocarina of Time";
NSMutableDictionary *statsMutable = [[NSMutableDictionary alloc] initWithDictionary:stats];
statsMutable[@"Weapon"] = @"Hammer";
這個改變讓objective-c變得更平易近人,操作上也更直觀。
結論
這些語法是完全向下相容的,經過compile後轉成2進位的編碼,是可以在舊的iOS環境執行的。
因此,別再留念舊方法啦!!!
參考資料:
-
Objective-C Literals - Mobile tuts+.
-
Objective-C Literals, Part 1 - Big Nerd Ranch Weblog.
-
Objective-C Literals official documentation - LLVM Home.