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);
    }];



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