Objective-C 的 object literal 已經出來很多年了,可以增進開發的進度、比較易讀,因此也用了很多年,筆記一下有哪些用法。
而這些 object literal ,前面都會跟著編譯器指令 @
。
編譯器指令:compiler directives
NSString
這是原本就一直存在的 literal ,用法很簡單
NSString *myString = @"Hello";
這樣即可。
NSNumber
NSNumber 本身具有 class cluster 的特性,初始化的時候就可以吃各種的基本型態:
NSNumber *integerNumber = [NSNumber numberWithInteger:76];
NSNumber *floatNumber = [NSNumber numberWithFloat:3.14];
NSNumber *boolNumber = [NSNumber numberWithBool:YES];
@
接著就可以換成
NSNumber *integerNumber = @76;
NSNumber *floatNumber = @3.14;
NSNumber *boolNumber = @YES;
用了 object literal 的方式後,更加容易識別參數的數值
NSArray
在 object literal 出來之前,NSArray 的初始化很麻煩:
NSArray *myArray = [NSArray arrayWithObjects:object1, object2, nil];
不只囉唆不易閱讀,最後面還要加的 nil 這個拖油瓶在後面。畢竟 ... NSArray arrayWithObjects: ...
雖然很容易讀懂我這個 method 要做什麼,但是對要初始化一個陣列,又變得似乎不太需要。
@[]
有了 object literal 之後,初始化一個陣列變得很簡單乾脆。
NSArray *myArray = @[object1, object2];
NSDictionary
NSDictionary 的話更難看出來塞了什麼資料,以下是他的建構方法(還有其他建構方式,請自行參照文件)
NSDictionary *myDictionary = [NSDictionary dictionaryWithObjectsAndKeys:key1, valueObject1, nil];
這時候不只容易搞混哪個是 key 、哪個是 value ,當塞入的參數一多,雖然可以透過分行來辨識,但是還是不是個很好的做法。
最後面一樣必須要有個 nil 這個拖油瓶。
@{}
有了 object literal 之後,使用 NSDictionary 的生活變得更簡單了。
NSDictionary *dictionary = @{key1: valueObject1, key2: valueObject2};
Box Expression - @()
最後一個就是 box expression
這個方法會用來動態產生一個物件,會自動判定 @([expression])
中的 expression 結果的值是什麼,則動態回傳對應的型別,
例如
// 等於 [NSNumber numberWithInteger:(1+1)] ,會回傳一個 NSNumber 物件
NSNumber *number1 = @(1+1);
// 等於 [NSNumber numberWithInteger:(AnEnum)] ,放入 enum 時,也會回傳 NSNumber 物件
NSNumber *state = @(AnEnum);
// 等於 [NSValue valueWithCGRect:view.frame] ,這時候是放入 CGRect ,則會回傳 NSValue 物件
NSValue value = @(view.frame);