標籤:
今天整理一下關於Objective-C Literals的內容,Literals翻譯成字面量或者字面值,就是直接被寫到原始碼中的值。這不是一個陌生的概念,我們在寫程式的時候能頻繁的見到。我們很早就見過NSString 字面量了:
NSString *greeting = @"Hello World";
它的文法很簡單,上面的代碼就是通過在C字串的前面加上@符號建立了一個NSString對象greeting,整段代碼看起來簡潔易懂,如果沒有直接量文法,那麼建立這個greeting可能就要使用下面的方法了:
1 NSString *greeting = [NSString stringWithUTF8String:"Hello World"];
在Xcode4.4和LLVM4.0之後,一些新特性被提出來,其中一個就是對NSNumber、NSArray和NSDictionary使用字面量文法。
NSNumber
在新特性提出來之前,我們要建立的一個NSNumber對象可能是這樣的:
1 NSNumber *aNumber = [NSNumber numberWithInt:22];
那麼現在就可以這樣寫:
1 NSNumber *aNumber = @22;
當然這裡不僅對於 -numberWithInt:適用,對於其他的也同樣適用:
1 //不用字面量的方式: 2 NSNumber *aBool = [NSNumber numberWithBool:YES]; 3 NSNumber *aChar = [NSNumber numberWithChar:‘a‘]; 4 NSNumber *aUnsigned = [NSNumber numberWithUnsignedInt:22U]; 5 NSNumber *aLong = [NSNumber numberWithLong:27L]; 6 NSNumber *aFloat = [NSNumber numberWithFloat:3.14F]; 7 NSNumber *aDouble = [NSNumber numberWithDouble:3.14]; 8 9 //字面量的寫法10 NSNumber *aBool = @YES;11 NSNumber *aChar = @‘a‘;12 NSNumber *aUnsigned = @22U;13 NSNumber *aLong = @27L14 NSNumber *aFloat = @3.14F;15 NSNumber *aDouble = @3.14;
除此之外,你還可以用運算式:
1 NSNumber *result = @(2+3*4);
NSArray
不使用字面量文法的時候,建立一個數組通常是這樣的:
1 NSArray *aArray = [NSArray arrayWithObjects: [NSNumber numberWithInt:22], @"kuntzuo", @"hello", nil];
而有了字面量文法之後,就可以這樣寫:
1 NSArray *aArray = @[@22, @"kuntzuo", @"hello"];
建立數組的字面量的方式變得更加簡潔了,在方括弧前面加上字面量@符號 ,裡面寫上內容,而且不再需要nil作為結束標誌了,如果沒有去掉nil會得一個警告,運行時會報錯。
NSDictionary
建立一個NSDictionary的傳統方式是這樣:
1 NSArray *keys = [NSArray arrayWithObjects:@"Name", @"Sex", @"Age", nil]; 2 3 NSArray *objects = [NSArray arrayWithObjects:@"kuntzuo", @"男", [NSNumber numberWithInt:22], nil]; 4 5 NSDictionary *myProfile = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; 6 7 //或者是 8 9 NSDictionary *myProfile = [NSDictionary dictionaryWithObjectsAndKeys:10 11 @"kuntzuo ", @"Name",12 13 @"男 ", @"Sex",14 15 [NSNumber numberWithInt:22], @"Age",16 17 nil];
以上兩種方法看起來都不簡單,而且容易混亂。字面量文法給我們更好的可選項,看看下面寫法:
1 NSDictionary *myProfile = @{"Name":"kuntzuo","Sex":"男","Age":@22};
除了用字面量來建立NSArray、NSNumber、NSDictionary之外。如果集合是可變類型如
NSMutableArray、NSMutableDictionary,新特性還允許你用下標的方式來訪問和修改集合中的值。下面的代碼簡單示範了這一特性。
1 //對於上面的NSArray *aArray 2 NSArray *aArray = @[@22, @"kuntzuo", @"hello"]; 3 NSMutableArray *mutableArray = [@[@22, @"kuntzuo", @"hello"] mutableCopy]; 4 5 //傳統訪問方式 6 NSString *greeting = [mutableArray objectAtIndex:2]; //"hello" 7 //新方法訪問 8 NSString *greeting = mutableArray[2]; // "hello" 9 //新方法修改10 mutableArray[2] = @"hello world";11 12 13 //對於上面的NSDictionary14 NSDictionary *myProfile = @{"Name":"kuntzuo","Sex":"男","Age":@22}15 NSMutableDictionary *mutableDic = [myProfile mutableCopy];16 //傳統訪問方式17 NSString *name = [mutableDic objectForKey:@"Name"]; // "kuntzuo"18 //新方法訪問19 NSString *myName = mutableDic[@"Name"];//"kuntzuo"20 //新方法修改21 mutableDic[@"Name"] = @"kuntian zuo";
這就是我所瞭解的Literals的全部內容,雖然現在也不算新東西了,不過我們掌握它還是很有必要的,既方便我們寫代碼,也可以是代碼的可讀性更高,風格更好。
Objective-C 之 Literals(字面量)