Apple LLVM Compiler 4.0提供了新的object literal語法。
這篇文章會跟大家分享這新功能,讓在撰寫Objective-C時能夠有效率。
也讓Objective-C看起來更貼近開發人員啦!
在Objective-C中,最常被使用的object literal為
1
NSString * myString = @"Thousand Squared" ;
在上述的例子中,@”Thousand Squared”為一個object literal,用來代表一個NSString object。如果不使用object literal的話,程式碼會長的很不一樣。
1
NSString * myString = [ NSString stringWithUTF8String: "Thousand Squared" ];
很明顯的可以知道,第一種寫法是比較好讀,也比較好寫的。
而新的Apple LLVM Compiler 4.0,增加了額外的object literal。
包含NSNumber object, NSArray object, NSDictionary object
NSNumber Literals
以NSNumber 為例:
以下程式碼為傳統的Objective-C寫法:
1
2
3
4
5
6
7
8
NSNumber * boolYES = [ NSNumber numberWithBool: YES ];
NSNumber * boolNO = [ NSNumber numberWithBool: NO ];
NSNumber * charX = [ NSNumber numberWithChar: 'X' ];
NSNumber * fortySevenInt = [ NSNumber numberWithInt: 47 ];
NSNumber * fortySevenUnsigned = [ NSNumber numberWithUnsignedInt: 47 U ];
NSNumber * fortySevenLong = [ NSNumber numberWithLong: 47L ];
NSNumber * goldenRatioFloat = [ NSNumber numberWithFloat: 1.61803F ];
NSNumber * goldenRatioDouble = [ NSNumber numberWithDouble: 1.61803 ];
現在,我們可以用object literals改寫成:
1
2
3
4
5
6
7
8
NSNumber * boolYES = @ YES ;
NSNumber * boolNO = @ NO ;
NSNumber * charX = @'X' ;
NSNumber * fortySevenInt = @ 47 ;
NSNumber * fortySevenUnsigned = @ 47 U ;
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 :
1
NSArray * instruments = [ NSArray arrayWithObjects: @"Ocarina" , @"Flute" , @"Harp" , nil ];
利用新的object literal方法建立NSArray :
1
NSArray * instruments = @ [ @"Ocarina" , @"Flute" , @"Harp" ];
很可惜的是,上述語法並不支援NSMutableArray ,但是我們可以利用一些小撇步來建立NSMutableArray :
1
NSMutableArray * instrumentsMutable = [ @ [ @"Ocarina" , @"Flute" , @"Harp" ] mutableCopy ];
Dictionary Literals
傳統語法建立NSDictionary object:
1
2
3
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 ];
或者,可以更簡單一點:
1
2
3
4
5
NSDictionary * stats = [ NSDictionary dictionaryWithObjectsAndKeys:
@"Zelda" , @"Character" ,
@"Sword" , @"Weapon" ,
[ NSNumber numberWithInt: 50 ], @"Hitpoints" ,
nil ];
有了新的object literal之後,一切變得更簡單:
1
2
3
NSDictionary * stats = @ { @"Character" : @"Zelda" ,
@"Weapon" : @"Sword" ,
@"Hitpoints" : @ 50 };
Collection Subscripting
除了利用object literal建立collection object之外,新的LLVM Compiler也提供存取collection object的方法─利用subscripts。
傳統的語法如下:
1
2
NSString * instrument = [ instruments objectAtIndex: 0 ];
NSString * name = [ stats objectForKey: @"Character" ];
現在,利用新的subscripts存取collection:
1
2
NSString * instrument = instruments [ 0 ];
NSString * name = stats [ @"Character" ];
除此之外,subscripting不只只有取出資料而已,如果你的collection為mutable的型態,你也可以用它來改變元素內容。
1
2
3
4
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 .