注:轉自 http://blog.devtang.com/blog/2012/08/05/use-modern-objective-c/
http://www.cocoachina.com/macdev/objc/2013/0105/5471.html
這個是我認爲最讚的一個改進。ObjectLiterals允許你方便地定義數字、數組和字典對象。這個功能類似於java5提供的autoboxing功能。這雖然是一個語法糖,但我認爲對提高寫代碼效率幫助很大。讓我們先來看看以前定義數字、數組和字典對象的方法:
NSNumber * number = [NSNumber numberWithInt:1];
NSArray * array = [NSArray arrayWithObjects:@"one", @"two",nil];
NSDictionary * dict = [NSDictionarydictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2",@"key2", nil];
是不是很噁心?現在以上代碼可以簡化成以下形式,注意到沒有,不用再在參數的最後加噁心的nil了,字典的key和value也不再是倒着先寫value,再寫key了:
NSNumber * number = @1;
NSArray * array = @[@"one", @"two"];
NSDictionary * dict = @{@"key1":@"value1", @"key2":@"value2"};
更多的示例如下:
// 整數
NSNumber *fortyTwo =@42; // 等價於 [NSNumber numberWithInt:42]
NSNumber *fortyTwoUnsigned =@42U; // 等價於[NSNumber numberWithUnsignedInt:42U]
NSNumber *fortyTwoLong =@42L; // 等價於 [NSNumber numberWithLong:42L]
NSNumber *fortyTwoLongLong =@42LL; // 等價於 [NSNumbernumberWithLongLong:42LL]
// 浮點數
NSNumber *piFloat [email protected]; // 等價於 [NSNumber numberWithFloat:3.141592654F]
NSNumber *piDouble [email protected]; // 等價於 [NSNumbernumberWithDouble:3.1415926535]
// 布爾值
NSNumber *yesNumber =@YES; // 等價於 [NSNumber numberWithBool:YES]
NSNumber *noNumber =@NO; // 等價於 [NSNumber numberWithBool:NO]
// 空數組
NSArray * array =@[]; // 等價於 [NSArray array]
// 空的字典
NSDictionary * dict =@{}; // 等價於 [NSDictionary dictionary]
遍歷元素
你是如何遍歷數組的元素的?通常我們有2種做法,一種是用 forin,另一種是用一個變量來循環數組下標。如下:
NSArray * lines = ...
for (NSString * line in lines) {
// ...
}
for (int i = 0; i < lines.count;++i) {
NSString *s = [lines objectAtIndex:i];
...
}
如果是字典,遍歷的代碼就要稍微複雜一點了:
NSDictionary * dict = …
NSArray * keys = [dict allKeys];
for (NSString * key in keys) {
NSString * value = [dictobjectForKey:key];
}
現在,xcode對於iOS4.0以上的系統,支持用block來遍歷元素了。用block來遍歷字典可以簡化代碼的編寫,建議大家都使用上這個新特性。
[lines enumerateObjectsUsingBlock:^(NSString *obj, NSUInteger idx, BOOL *stop) {
}];
[_urlArgumentsenumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop){
}];
Subscripting Methods
這個新特性在WWDC2012的視頻中提到了,但是在XCode4.4中沒有實現(在XCode4.5中實現了)。也是一個很體貼的語法糖,它允許你用中括號來代替原本的方法來獲取和設置數組元素。
簡單來說,以前的 [array objectAtIndex:idx] 和 [arrayreplaceObjectAtIndex:idx withObject:obj],可以直接寫作 array[idx] 和array[idx] =obj了。其實這個特性在很多高級語言中都實現了,只是Objective-C生於80年代,一直沒改進這個。
以下是一些示例代碼:
NSArray * array = @[ @"111", @"222", @"333"];
for (int i = 0; i < 3; ++i) {
NSLog(@"array[i] = %@",array[i]);
}
NSMutableDictionary * dict =[@{ @1:@"value1",
@2:@"value2",
@3: @"value3" } mutableCopy];
for (int i = 0; i < 3; ++i) {
NSLog(@"dict[%d] = %@", i,dict[@(i+1)]);
dict[@(i+1)] = [NSString stringWithFormat:@"new%@", dict[@(i+1)]];
}
[dict enumerateKeysAndObjectsUsingBlock:^(id key,id obj, BOOL *stop) {
NSLog(@"dict[%@] = %@", key,dict[key]);
}];