黑马软件工程师————OC中Foundation框架的数组和字典

黑马程序员————OC中Foundation框架的数组和字典

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------


在Foundation 框架中,NSArray、 NSSet 、NSDictionary 称为集合类:

NSArray :不可变数组
NSMutableArray :不可变数组

(有序的)
NSArray:

C语言中的数组,只能存放一种类型的数据。

OC中的数组,就是以面向对象的方式操作数组。

 c语言数组:只能放一种类型的数据
     int ages[10] = {1,90,89,17};
     Person *p = [[Person alloc]init];
     //数组放5个person对象
     Person *persons[5] = {p , [[Person alloc]init]};

OC数组的创建:
<span style="color:#ff0000;">//OC数组只能存放OC对象、不能存放非OC对象类型(基本数据类型),比如int ,struct ,enum等
    // OC数组不能存放nil值</span>
    
    //这个array永远是空数组,并没有进行初始化
    //NSArray *array = [NSArray array];
    
     1.NSArray的创建
     
    NSArray *array2 =  [NSArray arrayWithObject:@"jack"];
    
   <span style="color:#ff0000;"> //nil数组元素结束的标记,不能省</span>
    NSArray *array3 = [NSArray arrayWithObjects:@"jack",@"rose",nil]; 
    
    //NSArray *array4 = [NSArray arrayWithObjects:@"jack",@"rose", nil ];
   <span style="color:#ff0000;"> //快速创建一个NSArray对象 ,编译器特性
    NSArray *array4 = @[@"jack",@"rose"];     //掌握,常用</span>

计算数组中元素的个数:
     2. NSArray的元素个数
     
    // [array2 count];
    NSLog(@"%ld",array2.count) ;
    
    
<span style="color:#ff0000;">OC数组元素的访问:</span>
   <span style="color:#ff0000;">  NSArray中元素的访问
    //NSLog(@"%@",[array3 objectAtIndex:1]) ;    //第一种方式,不常用  = array[1];</span>
<span style="color:#ff0000;">    NSLog(@"%@",array3[0]);                //第二种方式  array[1]  编译器特性,用法和C中一样           开发中常用</span>

数组的遍历:

<span style="color:#ff0000;"><strong>for循环遍历:</strong></span>
   for (int i=0; i <array.count; i++)
   {
       NSLog(@"%@",array[i]);
   }
<strong><span style="color:#ff0000;">快速遍历: </span></strong><span style="color:#ff0000;"> id obj代表着数组中的每一个元素,</span>
<span style="color:#ff0000;"><strong>原理:把数组中的每一个元素拿出来赋值给obj,每赋值一次调用一次循环体</strong></span>
    //int i = 0;
    for (id obj in array)        
     {
       //找出obj在数组中的位置
       NSUInteger i = [array indexOfObject:obj];    
       NSLog(@"%ld---%@",i,obj);
         // i++;
    }
<span style="color:#ff0000;"><strong>通过block遍历:</strong></span>  
 [array enumerateObjectsUsingBlock:
  //每遍历到一个元素,就会调用一次block
  //并且当前元素和索引位置当作参数传给block
  ^(id obj, NSUInteger idx, BOOL *stop)
   {
     NSLog(@"%ld - %@",idx,obj);         
   }];
block 分析:
<pre name="code" class="objc">    
    //    void ^(myblock)(id, NSUInteger, BOOL) = ^(id obj, NSUInteger idx, BOOL *stop)
    //    {
    //        NSLog(@"%ld - %@",idx,obj);
    //        
    //        if(idx == 1) //遍历完1就停止
    //        {
    //            //停止遍历
    //            *stop = YES;
    //        }
    //
    //    };
    //    
    //    for(int i = 0;i <array.count,i++)
    //    {
    //    //用来标记是否需要停止遍历
    //        BOOL isStop = NO;
    //        
    //        //取出元素
    //        id obj = array[i];
    //        
    //        myblock(obj, i, &isStop);
    //        
    //        if(isStop)
    //        {
    //            break;
    //        }
    //    }



<span style="color:#ff0000;"><strong>利用枚举遍历数组:</strong></span>
    NSEnumerator *en = [array objectEnumerator];  
    id obj;  
    int j = 0 ;  
    while (obj = [en nextObject]) {  
        NSLog(@"5遍历array:%d-->%@",j,obj);  
        j++;  
    }  

NSMutableArray:(可变数组)

NSMutableArray *array = [NSMutableArray array];   //没有值
    
    //添加元素
    [array addObject:[[Person alloc]init]];
    [array addObject:@"jack"];
    
    //删除元素
    //[array removeAllObjects];
    //删除指定对象
    [array removeObject:@"jack"];
    [array removeObjectAtIndex:0];
    //错误写法
    // [array addObject:nil];
    
    NSLog(@"%ld",array.count);

<span style="color:#ff0000;">//@[] 只创建不可变数组NSArray,不能创建可变数组
    //错误写法
    NSMutableArrary *array = @[@"jack",@"rose"];
    [array addObject:@"jim"];</span>


(无序的)

NSSet和NSMutableSet:

<span style="color:#ff0000;">NSSet和NSArray的对比:
 1》共同点
 *都是集合,都能存放OC对象
 *只能存放OC对象,不能存放非OC对象类型(基本数据类型: int,char ,float等,结构体,枚举)
 *本身不可变,都有一个可变子类
 
 2》不同点:NSArray有顺序,NSSet没有顺序</span>
 
#import <Foundation/Foundation.h>

int main()
{
    NSMutableSet *s = [NSMutableSet set];
    
    //添加元素
    [s addObject:@"jack"];
        
    //删除元素
    [s removeObject:<#(id)#>];
    return 0;
}

//set的基本使用
void test()
{
    NSSet *s = [NSSet set];
    
    NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose",nil];
    
    //随机拿出一个元素
    NSString *str = [s2 anyObject];
    
    NSLog(@"%ld",s2.count);

}

NSDictionary和NSMutableDictionary:

     key:-->value
     索引:-->文字内容
     里面存储东西都是键值对
 
    //字典的创建方式一
 <span style="color:#ff0000;">   //NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];</span>
    
    
     //字典的创建方式二
    //    NSArray *keys = @[@"name",@"address"];
    //    NSArray *objects = @[@"jack",@"北京"];
    //    NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
    
     //字典的创建方式三
    //NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"jack",@"name",@"北京" ,@"address",nil];
    
    //字典的创建方式四    编译器特性,快速创建方式
   <span style="color:#ff0000;"> NSDictionary *dict = @{ @"name" : @"jack",@"address" : @"北京" };  //建议这样写</span>
    
    <span style="color:#ff0000;">//获取字典中的内容,根绝name取出jack
    //id obj = [dict objectForKey:@"name"];
    //编译器新特性
    id obj = dict[@"name"];     //与上一句等价</span>
    
    
    NSLog(@"%@",obj);
    
   <span style="color:#ff0000;"> NSLog(@"%ld",dict.count); // 返回的是键值对的个数</span>

字典的常用创建方式:
<span style="color:#ff0000;">NSDictionary *dict = @{ @"name" : @"jack",@"address" : @"北京" };</span>

NSMutableDictionary可变字典:

NSMutableDictionary *dict = [NSMutableDictionary dictionary ];
    
    //添加键值对
    [dict setObject:@"jack" forKey:@"name"];
    [dict setObject:@"北京" forKey:@"address"];
    //如果key相同,则覆盖掉以前的值
    [dict setObject:@"rose" forKey:@"name"];
    
    NSString *str = dict[@"name"];
    
    NSLog(@"%@",str);
    
    //移出键值对
    //[dict removeAllObjects]
    
    NSLog(@"%@",dict);

NSArray *persons = @[
    @{@"name": @"jack",@"qq": @"748523447",@"books":@[@"5分钟突破IOS编程",@"5分钟突破andrioid编程"]},
    @{@"name": @"tak",@"qq": @"7874655648"},
    @{@"name": @"jck",@"qq": @"4545465656"},
    @{@"name": @"rack",@"qq": @"452221524"}
    ];
        
   NSDictionary *dict =  persons[2];
    
    NSLog(@"%@",dict);
    
    //先取出1位置对应的字典
    //再取出字典中qq这个key对应的数据
    NSLog(@"%@",persons[1][@"qq"]);


字典不允许有相同的key,但允许有相同的value(Object)

字典的遍历:

<pre name="code" class="objc"> NSDictionary *dict = @{@"name":@"jack",@"qq":@"748523447",@"address":@"北京"}; 
<strong><span style="color:#ff0000;">for循环遍历:</span></strong>
    NSArray *keys = [dict allKeys];       //取出所有的key
    for (int i = 0; i<dict.count; i++)
    {
     NSString *key = keys[i];             //拿出对应位置的key
     NSString *object = dict[key];        //取出key对应的内容
     NSLog(@"%@ = %@",key,object);
     }
<strong><span style="color:#ff0000;">block遍历:</span> </strong>  
    [dict enumerateKeysAndObjectsUsingBlock:      //每定义一个键值对调用一次
     ^(id key, id obj, BOOL *stop) {
         NSLog(@"%@--%@",key ,obj);
     }];



集合类的总结:

 1.NSSArry\NSMutableArry

 *有序

 *快速创建(不可变):@[obj1,obj2,obj3....]

 *快速访问元素:数组名[i]

 
 2.NSSet\NSMutableSet

 *无序

 *无快速创建
 
 3.NSDictionary\NSMutableDictionary

 *无序

 *快速创建(不可变):@{key1 : value1,key2 : value2 ....}

 *快速访问元素:字典名[key]

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------