日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OC语法简化

發布時間:2024/7/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OC语法简化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
很多剛從其他編程語言轉到Objective-C的同學看到長長的函數名會感到崩潰,這種語法讓消息的傳遞像一個英語句子,大大增強了可讀性。比如你想初始化一個浮點數,需要這么寫: NSNumber?value = [NSNumber numberWithFloat:123.45f];

從這句中我們能夠明確的知道代碼的含義,但是,是否連簡單的賦值語句也要這么處理呢?蘋果在本次新特性中采用了折中的處理方式,針對很多基礎類型采用了簡寫的方式,實現語法簡化。簡化以后,我們會發現從語法層面,這些簡化的Objective-C更像Python和Ruby等動態語言的語法了。下面我們逐一介紹:

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;

裝箱表達式也可以采用類似的寫法:

NSNumber *piOverSixteen = [NSNumber numberWithDouble: ( M_PI / 16 )]; NSString *path = [NSString stringWithUTF8String: getenv("PATH")];

可以分別簡寫為:

NSNumber *piOverSixteen = @( M_PI / 16 ); NSString *path = @( getenv("PATH") );

對于字符串表達式來說,需要注意的是表達式的值一定不能是NULL,否則會拋出異常。

NSArray

對于NSArray的初始化來說,有非常多的寫法,這里就不再一一羅列,我們直接看新的寫法

NSArray *array; array = @[]; ? ? ? ? ? ? ? //空數組 array = @[ a ]; ? ? ? ? ?//一個對象的數組 array = @[ a, b, c ]; //多個對象的數組

非常簡單,再也不用記住初始化多個對象的數組時,后面還要跟一個倒霉的nil。 現在我們看一下當聲明多對象的數組時,編譯器是如何處理的:

array = @[ a, b, c ]; 編譯器生成的代碼: id objects[] = { a, b, c }; NSUInteger count = sizeof(objects)/ sizeof(id); array = [NSArray arrayWithObjects:objects count:count];

好吧,編譯器已經為我們把這些簡單重復的工作都做了,我們就可以安心解決真正的問題了:)不過有一點要注意,如果a,b,c對象有nil的話,運行時會拋出異常,這點和原來的處理方式不同,編碼的時候要多加小心。

NSDictionary

同樣,對于字典這個數據結構來說,有很多種初始化的方式,我們來看新的寫法:

NSDictionary *dict; dict = @{}; ? ? //空字典 dict = @{ k1 : o1 }; ? ? //包含一個鍵值對的字典 dict = @{ k1 : o1, k2 : o2, k3 : o3 }; //包含多個鍵值對的字典

最后我們總接一下容器類數據結構簡化的限制: 采用上述寫法構建的容器都是不可變的,如果需要生成可變容器,可以傳遞-mutableCopy消息。例如

NSMutableArray *mutablePlanets = [@[@"Mercury", @"Venus", @"Earth",@"Mars", @"Jupiter", @"Saturn",@"Uranus", @"Neptune"] mutableCopy];

不能對常量數組直接賦值,解決辦法是在類方法(void)initialize進行賦值,如下:

@implementation MyClass static NSArray *thePlanets; + (void)initialize {if (self == [MyClass class]) {thePlanets = @[@"Mercury", @"Venus", @"Earth",@"Mars", @"Jupiter", @"Saturn",@"Uranus", @"Neptune"]; } }

沒有常量字典

對象下標

容器的語法簡化讓我們不難想到,可以通過下標的方式存取數組和字典的數據。 比如對于數組:?

NSArray *array =?@[ a, b, c ];

我們可以這樣寫:

id obj = array[i]; ? ? //通過下標方式獲取數組對象,替換原有寫法:array objectAtIndex:i]; array[i] = newObj; ? ? //也可以直接為數組對象賦值。替換原有寫法:[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]


為自定義類添加下標支持

同時,我們自己定義的容器類,只要實現了規定的下標方法,就可以采用下標的方式訪問數據。要實現的方法如下:

數組和字典類型的下標方法

- (elementType)objectAtIndexedSubscript:(indexType)idx;? - (void)setObject:(elementType)object?atIndexedSubscript:(indexType)idx;?- (elementType)objectForKeyedSubscript:(keyType)key;? - (void)setObject:(elementType)object?forKeyedSubscript:(keyType)key;

其中需要注意的是indexType必須是整數,elementType和keyType必須是對象指針。

轉載自:http://www.infoq.com/cn/articles/wwdc2012-objective-c-new-feature/

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的OC语法简化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。