iOS Collection 集合

1、NSNumber

    // NSNumber numberWithChar
    NSNumber * num1 = [NSNumber numberWithChar:'A'];
    NSLog(@"num1=%@",num1);
    // numberWithInt
    // numberWithFloat
    // numberWithBool
    num1 = [NSNumber numberWithBool:NO];
    NSLog(@"num1=%@",num1);
    // charVaule
    // intValue
    // floatValue
    // boolValue
    NSLog(@"%hhd",[num1 boolValue]);

上面Demo的Log輸出爲:

2015-06-22 09:49:37.591 ObjC03[5534:303] num1=65
2015-06-22 09:49:37.595 ObjC03[5534:303] num1=0
2015-06-22 09:49:37.596 ObjC03[5534:303] 0

2、NSValue

    // NSValue
    CGSize si;
    si.height = 20;
    si.width = 10;
    // char a[2] = {'a','b'};
    NSValue * value = [NSValue valueWithBytes:&si objCType:@encode(CGSize)];
    // valueWithPoint
    // valueWithSize
    // valueWithRect
    CGSize size =[value sizeValue];
    NSLog(@"width=%f,height=%f",size.width,size.height);
上面代碼的Log輸出爲:

2015-06-22 09:49:37.596 ObjC03[5534:303] width=10.000000,height=20.000000

3、Collection集合

Collection(集合)是能夠容納多個事物的容器,在iOS中的集合有數組,字典,集合;

數組: 可以包含相同的元素

  • NSArray:不可變數組,可以存放多個對象,實例化的時候以nil表示結束,通過下標索引對象,NSArray中無法添加,刪除,修改元素;
  • NSMutableArray:可變數組,是NSArray的子類,相比NSArray增加了添加,刪除,修改元素的功能;

字典:

  • NSDictionary:不可變字典,存放多個鍵值對(key-value),最後以nil結束,字典中的對象存儲沒有順序,只能使用key來索引每個對象,不可以添加,刪除,修改元素;
  • NSMutableDictionary:可變字典,是NSDirctionary的子類;

在實例化不可變字典對象時,如果在參數的前邊已經包含了某一個關鍵字key,那麼在後邊出現的相同的關鍵字則不會添加到字典內;

在對可變字典對象添加元素時,如果在字典對象內已經包含了對應的key,則會用新的value值替換之前的value值;

集合: 不能包含相同的元素

  • NSSet:不可變集合,可以存放多個對象,以nil表示結束,對象在set中是無序的,不可以添加,刪除,修改元素;
  • NSMutableSet:可變集合,是NSSet的子類;

可變類通常比不可變類多了增刪改的功能;

Set集合是無序的,隨機取數據;


Collection的內存管理:

Collection會對自己內部的元素負責,元素添加(含初始化)Collection的時候,元素會自動retain,當元素remove的時候,元素會自動release,當Collection釋放銷燬的時候,會先讓內部元素release,然後自己再release


4、NSArray和NSMutableArray

NSMutableArray是NSArray的子類,NSArray長度固定,而NSMutableArray長度可變;

    // NSArray
    NSArray *arr = [[NSArray alloc] initWithObjects: @"zero", @"one", nil];
    // count
    NSLog(@"arr.count=%lu",[arr count]);
    // objectAtIndex
    NSLog(@"arr at 1 = %@",[arr objectAtIndex:1]);
    NSString *str = [NSString stringWithFormat:@"ten"];
    // [arr insertValue:<#(id)#> inPropertyWithKey:<#(NSString *)#>];
    
    // NSMutableArray
    NSMutableArray *arr1 = [[NSMutableArray alloc]initWithCapacity:12];
    // arr1 = [NSMutableArray arrayWithCapacity:12];
    // addObject
    [arr1 addObject:@"two"];
    NSLog(@"arr1.count=%lu",[arr1 count]);
    NSLog(@"arr1 at 0 = %@",[arr1 objectAtIndex:0]);
    [arr1 addObject:str];
    NSLog(@"arr1.count=%lu",[arr1 count]);
    NSLog(@"arr1 at 1 = %@",[arr1 objectAtIndex:1]);
    // removeAllObjects
    // removeLastObject
    // removeObjectAtIndex
    // replaceObjectAtIndex
    [arr1 replaceObjectAtIndex:1 withObject:@"three"];
    NSLog(@"arr1 at 1 = %@",[arr1 objectAtIndex:1]);
上面代碼的Log輸出爲:

2015-06-22 09:49:37.597 ObjC03[5534:303] arr.count=2
2015-06-22 09:49:37.598 ObjC03[5534:303] arr at 1 = one
2015-06-22 09:49:37.599 ObjC03[5534:303] arr1.count=1
2015-06-22 09:49:37.603 ObjC03[5534:303] arr1 at 0 = two
2015-06-22 09:49:37.605 ObjC03[5534:303] arr1.count=2
2015-06-22 09:49:37.612 ObjC03[5534:303] arr1 at 1 = ten
2015-06-22 09:49:37.613 ObjC03[5534:303] arr1 at 1 = three

5、NSDictionary和NSMutableDictionary

字典中 key 一般用 NSString 或者 NSNumber,而且值可以是任一類型;

值對象不能爲nil;

    // NSDictionary
    // -(id)initWithObjects :(NSArray *) objectforKeys: (NSArray *)keys
    // +(id)dictionaryWithObject :id(anObject)
    // [NSDictionary dictionaryWithObject:<#(id)#> forKey:<#(id<NSCopying>)#>];
    NSDictionary * dic = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2", nil];
    // count
    NSLog(@"dic.count = %lu",[dic count]);
    // get allKeys
    NSArray *arrKeys =[dic allKeys];
    int count = (int)[arrKeys count];
    
    // loop1
    for(int i = 0;i<count ;i++){
        NSLog(@"dic.key%d = %@",(i + 1),[arrKeys objectAtIndex:i]);
        // 1.getValue from key
        NSLog(@"dic.value = %@",[dic objectForKey:[arrKeys objectAtIndex:i]]);
        // 2.getValue from key
        // NSLog(@"dic.value = %@",[dic valueForKey:[arrKeys objectAtIndex:i]]);
    }
    // loop2
    NSString * key;
    for(k in dic){
        NSLog(@"key = %@ , value=%@", key , [dic valueForKey:key]);
    }
    
    // NSMutableDictionary
    NSMutableDictionary *dic2 = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"v1",@"k1",@"v2",@"k2", nil];
    [dic2 setObject:@"v3" forKey:@"k3"];
    NSLog(@"dic2.length = %d",(int)[dic2 count]);
    NSLog(@"dic2's value of k3 = %@",[dic2 objectForKey:@"k3"]);
    // setValue
    [dic2 setValue:@"k3_new" forKey:@"k3"];
    NSLog(@"dic2's value of k3 = %@",[dic2 objectForKey:@"k3"]);
    // removeObjectForKey :(id)key;
    // removeAllObjects;
上面代碼的輸出爲:

2015-06-22 09:59:53.624 ObjC04[5574:303] dic.count = 2
2015-06-22 09:59:53.628 ObjC04[5574:303] dic.key1 = key1
2015-06-22 09:59:53.629 ObjC04[5574:303] dic.value = value1
2015-06-22 09:59:53.630 ObjC04[5574:303] dic.key2 = key2
2015-06-22 09:59:53.632 ObjC04[5574:303] dic.value = value2
2015-06-22 09:59:53.634 ObjC04[5574:303] key = key1 , value=value1
2015-06-22 09:59:53.635 ObjC04[5574:303] key = key2 , value=value2
2015-06-22 09:59:53.636 ObjC04[5574:303] dic2.length = 3
2015-06-22 09:59:53.637 ObjC04[5574:303] dic2's value of k3 = v3
2015-06-22 09:59:53.638 ObjC04[5574:303] dic2's value of k3 = k3_new

6、NSSet和NSMutableSet

NSSet 集合和數組差不多,不過集合中不能存放相同的對象,是一組單值對象的集合,並且被存放到集中的元素是無序的;

    // NSSet
    NSSet * set = [NSSet setWithObjects:@"zero", @"one", @"three", nil];
    // -(id)initWithObjects
    NSLog(@"set's count = %d",(int)[set count]);
    // allObjects
    count = (int)[set count];
    NSArray *objs = [set allObjects];
    // loop1
    for(int i = 0;i<count ;i++){
        NSLog(@"%@",[objs objectAtIndex:i]);
    }
    // loop2
    for(NSString * e in objs){
        NSLog(@"e = %@",e);
    }
    
    // anyObject
    NSString * obj = [set anyObject];
    NSLog(@"anyObject=%@",obj);
    // isEqualToSet : compare two set
    // member : obj (contains)
    NSLog(@"is contains 'one' =%@",[set member:@"one"]);
    NSLog(@"is contains 'two' =%@",[set member:@"two"]);
    
    // NSMutableSet
    // 指定新分配的集合爲size個成員存儲空間
    NSMutableSet * set1 = [[NSMutableSet alloc] initWithCapacity:12];
    [set1 addObject:@"zero_0"];
    NSString * any1 = [set1 anyObject];
    NSLog(@"any1 = %@",any1);
以上代碼的Log輸了爲:

2015-06-22 09:59:53.639 ObjC04[5574:303] set's count = 3
2015-06-22 09:59:53.641 ObjC04[5574:303] zero
2015-06-22 09:59:53.642 ObjC04[5574:303] one
2015-06-22 09:59:53.643 ObjC04[5574:303] three
2015-06-22 09:59:53.643 ObjC04[5574:303] e = zero
2015-06-22 09:59:53.644 ObjC04[5574:303] e = one
2015-06-22 09:59:53.645 ObjC04[5574:303] e = three
2015-06-22 09:59:53.647 ObjC04[5574:303] anyObject=zero
2015-06-22 09:59:53.649 ObjC04[5574:303] is contains 'one' =one
2015-06-22 09:59:53.651 ObjC04[5574:303] is contains 'two' =(null)
2015-06-22 09:59:54.376 ObjC04[5574:303] any1 = zero_0

7、快速枚舉

枚舉:對集合中的元素依次,不重複地一一進行遍歷。
傳統語法中,枚舉一般通過 for 循環來進行:

for(int i = 0;i < n;i++)
{
<span style="white-space:pre">	</span>id anObject = [array objectAtIndex:i];
}

Objective-C 2.0 中提供了一種簡潔的特色語法,令你可以安全又快速地對集合中的元素進行枚舉。
for...in 是 Objective-C 2.0 中的特色語法,它的標準形式如下:
for(Type newVariable in expression)
{
<span style="white-space:pre">	</span>statements;
}

或者:
Type variable;
for(variable in expression)
{
<span style="white-space:pre">	</span>statements;
}


遍歷:

    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@=%@,end = %d",key, obj, *stop);
    }];
    
    [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"arr:%@ %d",obj, *stop);
    }];



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章