IOS開發之OC語法簡化

jopen 10年前發布 | 13K 次閱讀 iOS開發 移動開發 IOS

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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!