黑马软件工程师————OC中Foundation框架的数组和字典
黑马程序员————OC中Foundation框架的数组和字典
计算数组中元素的个数:
数组的遍历:
NSDictionary和NSMutableDictionary:
字典的常用创建方式:
字典不允许有相同的key,但允许有相同的value(Object)
------<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>、期待与您交流! -------