Thousand Squared

希望能分享一些學習心得啊啊啊~~~.

Objective-C Literals 介紹

| Comments

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:47U];
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 = @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

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環境執行的。
因此,別再留念舊方法啦!!!

參考資料:

  1. Objective-C Literals - Mobile tuts+.
  2. Objective-C Literals, Part 1 - Big Nerd Ranch Weblog.
  3. Objective-C Literals official documentation - LLVM Home.

Comments