1. 程式人生 > >關於iOS中 遍歷一個數組的方法

關於iOS中 遍歷一個數組的方法

1,最經典的 for迴圈 

2 ,for in 迴圈

3.dispatch_apply 

/*!
 2  *  @brief  例項:當要對NSArray類物件的所有元素執行處理時,不必一個一個的編寫for迴圈部分
 3  */
 4 - (void)dispatchApplyTest2 {
 5     //1.建立NSArray類物件
 6     NSArray *array = @[@"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h", @"i", @"j"];
 7     
 8     //2.建立一個全域性佇列
 9     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
10     
11     //3.通過dispatch_apply函式對NSArray中的全部元素進行處理,並等待處理完成,
12     dispatch_apply([array count], queue, ^(size_t index) {
13         NSLog(@"%zu: %@", index, [array objectAtIndex:index]);
14     });
15     NSLog(@"done");
16     /*!
17      *  @brief  輸出結果
18      *
19      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167871] 0: a
20      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167956] 1: b
21      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167957] 3: d
22      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167871] 4: e
23      2016-02-25 19:37:17.309 dispatch_apply測試[3010:167957] 6: g
24      2016-02-25 19:37:17.309 dispatch_apply測試[3010:167871] 7: h
25      2016-02-25 19:37:17.309 dispatch_apply測試[3010:167957] 8: i
26      2016-02-25 19:37:17.309 dispatch_apply測試[3010:167871] 9: j
27      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167956] 5: f
28      2016-02-25 19:37:17.308 dispatch_apply測試[3010:167955] 2: c
29      *  !!!因為在Global Dispatch Queue中執行,所以各個處理的執行時間不定
30         但done一定會輸出在最後的位置,因為dispatch_apply函式會等待所以的處理結束
31      */
32 }

4 makeObjectsPerformSelector

一. 陣列的makeObjectsPerformSelector:SEL方法來減少自己寫迴圈程式碼.
 [self.answerView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
 

 1.  makeObjectsPerformSelector:@select(aMethod)

     簡介:讓陣列中的每個元素 都呼叫 aMethod 

 2.  makeObjectsPerformSelector:@select(aMethod) withObject:oneObject

     簡介:讓陣列中的每個元素 都呼叫 aMethod  並把 withObject 後邊的 oneObject 物件做為引數傳給方法aMethod

[array makeObjectsPerformSelector:@selector(setRecurringDelegate:) withObject:self]; /*將檢測到的該自動插入的交易插入資料庫*/
 
[array makeObjectsPerformSelector:@selector(insertRecursion)];
/*將檢測到的該自動插入的交易插入資料庫*/

5.KVC的keyPath中的集合運算子的使用

簡單集合操作符 

@count: 返回一個值為集合中物件總數的 NSNumber物件。 
@sum: 首先把集合中的每個物件都轉換為 double型別,然後計算其總,最後返回一個值為這個總和的 NSNumber物件。 
@avg: 把集合中的每個物件都轉換為 double型別,返回一個值為平均值的 NSNumber物件。 
@max: 使用 compare:方法來確定最大值。所以為了讓其正常工作,集合中所有的物件都必須支援和另一個物件的比較。 
@min: 和 @max一樣,但是返回的是集合中的最小值。 物件操作符
物件操作符 
想象下,我們有一個inventory陣列,代表了當地蘋果商店的當前庫存(iPad Mini不足,並且沒有新的iMac,因為還沒有發貨):

Objective-C

NSArray *inventory = @[iPhone5, iPhone5, iPhone5, iPadMini, macBookPro, macBookPro]; 

@unionOfObjects / @distinctUnionOfObjects: 返回一個由操作符右邊的key path所指定的物件屬性組成的陣列。其中 @distinctUnionOfObjects 會對陣列去重, 而且 @unionOfObjects 不會

6. enumerateObjectsUsingBlock

NSDictionary * dic = [NSDictionary dictionaryWithObjectsAndKeys:@"obj1",@"key1",@"obj2",@"key2", nil];
    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id value, BOOL *stop) {
        NSLog(@"value for key %@ is %@ ", key, value);
        if ([@"key2" isEqualToString:key]) {
            *stop = YES;
        }
    }];

7.enumerateObjectsWithOptions

- (void)testEnumerateObjectsWithOptionsForArrayFunc  
{  
    NSArray *array = [[NSArray alloc]initWithObjects:@"a",@"b",@"c",@"d",@"e",@"f", nil];  
      
    //遍歷陣列元素  
    [array enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {  
        CHDebugLog(@"obj=%@   idx=%ld",obj,idx);  
    }];  
      
    //NSEnumerationReverse 倒序排列  
    [array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL * _Nonnull stop) {  
        CHDebugLog(@"idx=%ld, id=%@", idx, obj);  
          
        //當需要結束迴圈的時候,呼叫stop,賦予YES  
        if (idx ==3) {  
            *stop = YES;  
        }  
          
    }];  
}