OC的語法簡寫

NSNumber 全部的[NSNumber numberWith…:]方法均可以簡寫了:
[cpp]  view plain  copy
  1. [NSNumber numberWithChar:‘X’] 簡寫爲 @‘X’;  
  2. [NSNumber numberWithInt:12345] 簡寫爲 @12345  
  3. [NSNumber numberWithUnsignedLong:12345ul] 簡寫爲 @12345ul  
  4. [NSNumber numberWithLongLong:12345ll] 簡寫爲 @12345ll  
  5. [NSNumber numberWithFloat:123.45f] 簡寫爲 @123.45f  
  6. [NSNumber numberWithDouble:123.45] 簡寫爲 @123.45  
  7. [NSNumber numberWithBool:YES] 簡寫爲 @YES  

嗯…方便不少啊~之前最討厭的就是數字放Array裏還要封裝成NSNumber了…如今的話直接用@開頭接數字,能夠簡化很多。

NSArray 部分NSArray方法獲得了簡化:
[html]  view plain  copy
  1. [NSArray array] 簡寫爲 @[]  
  2. [NSArray arrayWithObject:a] 簡寫爲 @[ a ]  
  3. [NSArray arrayWithObjects:a, b, c, nil] 簡寫爲 @[ a, b, c ]  
    
    能夠理解爲@符號就表示NS對象(和NSString的@號同樣),而後接了一個在不少其餘語言中常見的方括號[]來表示數組。實際上在咱們使用簡寫時,編譯器會將其自動翻譯補全爲咱們常見的代碼。好比對於@[ a, b, c ],實際編譯時的代碼是
1 // compiler generates:
2  
3 id objects[] = { a, b, c };
4 NSUInteger count = sizeof(objects)/ sizeof(id);
5 array = [NSArray arrayWithObjects:objects count:count];
須要特別注意,要是a,b,c中有nil的話,在生成NSArray時會拋出異常,而不是像[NSArray arrayWithObjects:a, b, c, nil]那樣造成一個不完整的NSArray。其實這是很好的特性,避免了難以查找的bug的存在。

NSDictionary 
既然數組都簡化了,字典也沒跑兒,仍是和Perl啊Python啊Ruby啊很類似,意料之中的寫法:
[html]  view plain  copy
  1. [NSDictionary dictionary] 簡寫爲 @{}  
  2. [NSDictionary dictionaryWithObject:o1 forKey:k1] 簡寫爲 @{ k1 : o1 }  
  3. [NSDictionary dictionaryWithObjectsAndKeys:o1, k1, o2, k2, o3, k3, nil] 簡寫爲 @{ k1 : o1, k2 : o2, k3 : o3 }  

    和數組相似,當寫下@{ k1 : o1, k2 : o2, k3 : o3 }時,實際的代碼會是
1 // compiler generates:
2 id objects[] = { o1, o2, o3 };
3 id keys[] = { k1, k2, k3 };
4 NSUInteger count = sizeof(objects) / sizeof(id);
5 dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys count:count];
 

Mutable版本和靜態版本 
    上面所生成的版本都是不可變的,想獲得可變版本的話,能夠對其發送-mutableCopy消息以生成一份可變的拷貝。好比
1 NSMutableArray *mutablePlanets = [@[
2                                   @\\"Mercury\\", @\\"Venus\\",
3                                   @\\"Earth\\", @\\"Mars\\",
4                                   @\\"Jupiter\\", @\\"Saturn\\",
5                                   @\\"Uranus\\", @\\"Neptune\\" ]
6                                   mutableCopy];
另外,對於標記爲static的數組(沒有static的字典..哈希和排序是在編譯時完成的並且cocoa框架的key也不是常數),不能使用簡寫爲其賦值(其實原來的傳統寫法也不行)。解決方法是在類方法+ (void)initialize中對static進行賦值,好比:
 
1 static NSArray *thePlanets;
2 + (void)initialize {
3     if (self == [MyClass class]) {
4         thePlanets = @[ @\\"Mercury\\", @\\"Venus\\", @\\"Earth\\", @\\"Mars\\", @\\"Jupiter\\", @\\"Saturn\\", @\\"Uranus\\", @\\"Neptune\\" ];
5     }
6 }

下標 
    其實使用這些簡寫的一大目的是可使用下標來訪問元素:
[html]  view plain  copy
  1. [array objectAtIndex:idx] 簡寫爲 array[idx];  
  2. [array replaceObjectAtIndex:idx withObject:newObj] 簡寫爲 array[idx] = newObj  
  3. [dic objectForKey:key] 簡寫爲 dic[key]  
  4. [dic setObject:object forKey:key] 簡寫爲 dic[key] = newObject  

    很方便,可是必定須要注意,對於字典用的也是方括號[],而不是想象中的花括號{}。估計是想避免和代碼塊的花括號發生衝突吧…簡寫的實際工做原理其實真的就只是簡單的對應的方法的簡寫,沒有什麼驚喜。 可是仍是有驚喜的..那就是使用相似的一套方法,能夠作到對於咱們本身的類,也可使用下標來訪問。而爲了達到這樣的目的,咱們須要實現如下方法, 對於相似數組的結構:
 
1 - (elementType)objectAtIndexedSubscript:(indexType)idx;
2  
3 - (void)setObject:(elementType)object atIndexedSubscript:(indexType)idx;
 
 對於相似字典的結構:
 
1 - (elementType)objectForKeyedSubscript:(keyType)key;
2  
3 - (void)setObject:(elementType)object forKeyedSubscript:(keyType)key;
相關文章
相關標籤/搜索