object-c 新特性,object literals 堅持,慢慢改變使用習慣

注:轉自 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]);
}];



發佈了28 篇原創文章 · 獲贊 22 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章