OC语法简化
從這句中我們能夠明確的知道代碼的含義,但是,是否連簡單的賦值語句也要這么處理呢?蘋果在本次新特性中采用了折中的處理方式,針對很多基礎(chǔ)類型采用了簡寫的方式,實現(xiàn)語法簡化。簡化以后,我們會發(fā)現(xiàn)從語法層面,這些簡化的Objective-C更像Python和Ruby等動態(tài)語言的語法了。下面我們逐一介紹:
NSNumber
簡化前的寫法:
NSNumber *value; value = [NSNumber numberWithInt:12345]; value = [NSNumber numberWithFloat:123.45f]; value = [NSNumber numberWithDouble:123.45]; value = [NSNumber numberWithBool:YES];簡化后的寫法:
NSNumber *value; value = @12345; value = @123.45f; value = @123.45; value = @YES;裝箱表達(dá)式也可以采用類似的寫法:
NSNumber *piOverSixteen = [NSNumber numberWithDouble: ( M_PI / 16 )]; NSString *path = [NSString stringWithUTF8String: getenv("PATH")];可以分別簡寫為:
NSNumber *piOverSixteen = @( M_PI / 16 ); NSString *path = @( getenv("PATH") );對于字符串表達(dá)式來說,需要注意的是表達(dá)式的值一定不能是NULL,否則會拋出異常。
NSArray
對于NSArray的初始化來說,有非常多的寫法,這里就不再一一羅列,我們直接看新的寫法
NSArray *array; array = @[]; ? ? ? ? ? ? ? //空數(shù)組 array = @[ a ]; ? ? ? ? ?//一個對象的數(shù)組 array = @[ a, b, c ]; //多個對象的數(shù)組非常簡單,再也不用記住初始化多個對象的數(shù)組時,后面還要跟一個倒霉的nil。 現(xiàn)在我們看一下當(dāng)聲明多對象的數(shù)組時,編譯器是如何處理的:
array = @[ a, b, c ]; 編譯器生成的代碼: id objects[] = { a, b, c }; NSUInteger count = sizeof(objects)/ sizeof(id); array = [NSArray arrayWithObjects:objects count:count];好吧,編譯器已經(jīng)為我們把這些簡單重復(fù)的工作都做了,我們就可以安心解決真正的問題了:)不過有一點要注意,如果a,b,c對象有nil的話,運行時會拋出異常,這點和原來的處理方式不同,編碼的時候要多加小心。
NSDictionary
同樣,對于字典這個數(shù)據(jù)結(jié)構(gòu)來說,有很多種初始化的方式,我們來看新的寫法:
NSDictionary *dict; dict = @{}; ? ? //空字典 dict = @{ k1 : o1 }; ? ? //包含一個鍵值對的字典 dict = @{ k1 : o1, k2 : o2, k3 : o3 }; //包含多個鍵值對的字典最后我們總接一下容器類數(shù)據(jù)結(jié)構(gòu)簡化的限制: 采用上述寫法構(gòu)建的容器都是不可變的,如果需要生成可變?nèi)萜?#xff0c;可以傳遞-mutableCopy消息。例如
NSMutableArray *mutablePlanets = [@[@"Mercury", @"Venus", @"Earth",@"Mars", @"Jupiter", @"Saturn",@"Uranus", @"Neptune"] mutableCopy];不能對常量數(shù)組直接賦值,解決辦法是在類方法(void)initialize進(jìn)行賦值,如下:
@implementation MyClass static NSArray *thePlanets; + (void)initialize {if (self == [MyClass class]) {thePlanets = @[@"Mercury", @"Venus", @"Earth",@"Mars", @"Jupiter", @"Saturn",@"Uranus", @"Neptune"]; } }沒有常量字典
對象下標(biāo)
容器的語法簡化讓我們不難想到,可以通過下標(biāo)的方式存取數(shù)組和字典的數(shù)據(jù)。 比如對于數(shù)組:?
NSArray *array =?@[ a, b, c ];我們可以這樣寫:
id obj = array[i]; ? ? //通過下標(biāo)方式獲取數(shù)組對象,替換原有寫法:array objectAtIndex:i]; array[i] = newObj; ? ? //也可以直接為數(shù)組對象賦值。替換原有寫法:[array replaceObjectAtIndex:i withObject:newObj];對于字典:
NSDictionary *dict = @{ k1 : o1, k2 : o2, k3 : o3 };我們可以這樣寫:
id obj =?dict[k2]; ? ? //獲取o2對象,替換原有寫法:[dic objectForKey:k2]; dic[k2] = newObj; ?//重新為鍵為k2的對象賦值,替換原有寫法:[dic setObject:newObj?forKey:k2]
為自定義類添加下標(biāo)支持
同時,我們自己定義的容器類,只要實現(xiàn)了規(guī)定的下標(biāo)方法,就可以采用下標(biāo)的方式訪問數(shù)據(jù)。要實現(xiàn)的方法如下:
數(shù)組和字典類型的下標(biāo)方法
- (elementType)objectAtIndexedSubscript:(indexType)idx;? - (void)setObject:(elementType)object?atIndexedSubscript:(indexType)idx;?- (elementType)objectForKeyedSubscript:(keyType)key;? - (void)setObject:(elementType)object?forKeyedSubscript:(keyType)key;其中需要注意的是indexType必須是整數(shù),elementType和keyType必須是對象指針。
轉(zhuǎn)載自:http://www.infoq.com/cn/articles/wwdc2012-objective-c-new-feature/
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
- 上一篇: python去掉人像白边_python
- 下一篇: 六、区块链主流共识算法浅析