IOS開發之OC語法簡化
NSNumber
簡化前的寫法:
NSNumber *value; value = [NSNumber numberWithInt:12345]; value = [NSNumber numberWithFloat:123.45f]; value = [NSNumber numberWithBool:YES];
簡化后的寫法:
NSNumber *value; value = @12345; value = @123.45f; 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 }; //包含多個鍵值對的字典
最后我們總接一下容器類數據結構簡化的限制:
1、采用上述寫法構建的容器都是不可變的,如果需要生成可變容器,可以傳遞-mutableCopy消息。例如
NSMutableArray *mutablePlanets = [@[ @"Mercury", @"Venus", @"Earth", @"Mars", @"Jupiter", @"Saturn", @"Uranus", @"Neptune" ] mutableCopy];
2、不能對常量數組直接賦值,解決辦法是在類方法(void)initialize進行賦值,如下:
@implementation MyClass static NSArray *thePlanets; + (void)initialize { if (self == [MyClass class]) { thePlanets = @[ @"Mercury", @"Venus", @"Earth", @"Mars", @"Jupiter", @"Saturn", @"Uranus", @"Neptune" ]; } }
3、沒有常量字典
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!