NSNumber 全部的[NSNumber numberWith…:]方法均可以簡寫了:
- [NSNumber numberWithChar:‘X’] 簡寫爲 @‘X’;
- [NSNumber numberWithInt:12345] 簡寫爲 @12345
- [NSNumber numberWithUnsignedLong:12345ul] 簡寫爲 @12345ul
- [NSNumber numberWithLongLong:12345ll] 簡寫爲 @12345ll
- [NSNumber numberWithFloat:123.45f] 簡寫爲 @123.45f
- [NSNumber numberWithDouble:123.45] 簡寫爲 @123.45
- [NSNumber numberWithBool:YES] 簡寫爲 @YES
嗯…方便不少啊~之前最討厭的就是數字放Array裏還要封裝成NSNumber了…如今的話直接用@開頭接數字,能夠簡化很多。
NSArray 部分NSArray方法獲得了簡化:
- [NSArray array] 簡寫爲 @[]
- [NSArray arrayWithObject:a] 簡寫爲 @[ a ]
- [NSArray arrayWithObjects:a, b, c, nil] 簡寫爲 @[ a, b, c ]
能夠理解爲@符號就表示NS對象(和NSString的@號同樣),而後接了一個在不少其餘語言中常見的方括號[]來表示數組。實際上在咱們使用簡寫時,編譯器會將其自動翻譯補全爲咱們常見的代碼。好比對於@[ a, b, c ],實際編譯時的代碼是
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啊很類似,意料之中的寫法:
- [NSDictionary dictionary] 簡寫爲 @{}
- [NSDictionary dictionaryWithObject:o1 forKey:k1] 簡寫爲 @{ k1 : o1 }
- [NSDictionary dictionaryWithObjectsAndKeys:o1, k1, o2, k2, o3, k3, nil] 簡寫爲 @{ k1 : o1, k2 : o2, k3 : o3 }
和數組相似,當寫下@{ k1 : o1, k2 : o2, k3 : o3 }時,實際的代碼會是
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\\" ] |
另外,對於標記爲static的數組(沒有static的字典..哈希和排序是在編譯時完成的並且cocoa框架的key也不是常數),不能使用簡寫爲其賦值(其實原來的傳統寫法也不行)。解決方法是在類方法+ (void)initialize中對static進行賦值,好比:
1 |
static NSArray *thePlanets; |
3 |
if (self == [MyClass class]) { |
4 |
thePlanets = @[ @\\"Mercury\\", @\\"Venus\\", @\\"Earth\\", @\\"Mars\\", @\\"Jupiter\\", @\\"Saturn\\", @\\"Uranus\\", @\\"Neptune\\" ]; |
下標
其實使用這些簡寫的一大目的是可使用下標來訪問元素:
- [array objectAtIndex:idx] 簡寫爲 array[idx];
- [array replaceObjectAtIndex:idx withObject:newObj] 簡寫爲 array[idx] = newObj
- [dic objectForKey:key] 簡寫爲 dic[key]
- [dic setObject:object forKey:key] 簡寫爲 dic[key] = newObject
很方便,可是必定須要注意,對於字典用的也是方括號[],而不是想象中的花括號{}。估計是想避免和代碼塊的花括號發生衝突吧…簡寫的實際工做原理其實真的就只是簡單的對應的方法的簡寫,沒有什麼驚喜。 可是仍是有驚喜的..那就是使用相似的一套方法,能夠作到對於咱們本身的類,也可使用下標來訪問。而爲了達到這樣的目的,咱們須要實現如下方法, 對於相似數組的結構:
1 |
- (elementType)objectAtIndexedSubscript:(indexType)idx; |
3 |
- (void)setObject:(elementType)object atIndexedSubscript:(indexType)idx; |
對於相似字典的結構:
1 |
- (elementType)objectForKeyedSubscript:(keyType)key; |
3 |
- (void)setObject:(elementType)object forKeyedSubscript:(keyType)key; |