【黑马程序员】————Foundation框架02常用类—集合类
NSArray
->NSMutableArray
NSSet
->NSMutableSet
NSDictionary
->NSMutableDictionary
1、NSArray/NSMutableArray
NSArray :不可变数组
NSMutableArray : 可变数组
基本使用
1 void use() 2 { 3 /* 4 C数组对比 5 int a = 5; 6 7 int ages[10] = {1, 90, 89, 17}; 8 9 Person *p = [[Person alloc] init]; 10 Person *persons[5] = {p, [[Person alloc] init]}; 11 */ 12 13 // OC数组不能存放nil值 14 // OC数组只能存放OC对象、不能存放非OC对象类型,比如int、struct、enum等 15 16 // 这个array永远是空数组 17 // NSArray *array = [NSArray array]; 18 19 20 /* 21 1.NSArray的创建 22 */ 23 NSArray *array2 = [NSArray arrayWithObject:@"jack"]; 24 25 // nil是数组元素结束的标记 26 NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", nil]; 27 // [array2 count]; 28 29 //NSArray *array4 = [NSArray arrayWithObjects:@"jack", @"rose", @"4324324", nil]; 30 31 // 快速创建一个NSArray对象 32 NSArray *array4 = @[@"jack", @"rose", @"4324324"]; 33 34 35 /* 36 2.NSArray的元素个数 37 */ 38 NSLog(@"%ld", array3.count); 39 40 41 /* 42 3.NSArray中元素的访问 43 */ 44 NSLog(@"%@", [array3 objectAtIndex:1]); 45 46 //array3[1]; 47 NSLog(@"%@", array3[0]); 48 }
遍历数组
1 oid use2() 2 { 3 Person *p = [[Person alloc] init]; 4 5 NSArray *array = @[p, @"rose", @"jack"]; 6 7 // for (int i = 0; i<array.count; i++) 8 // { 9 // NSLog(@"%@", array[i]); 10 // } 11 12 // id obj代表着数组中的每一个元素 13 //int i = 0; 14 // for (id obj in array) 15 // { 16 // // 找出obj元素在数组中的位置 17 // NSUInteger i = [array indexOfObject:obj]; 18 // 19 // NSLog(@"%ld - %@", i, obj); 20 // //i++; 21 // 22 // if (i==1) 23 // { 24 // break; 25 // } 26 // } 27 28 [array enumerateObjectsUsingBlock: 29 30 // 每遍历到一个元素,就会调用一次block 31 // 并且当前元素和索引位置当做参数传给block 32 ^(id obj, NSUInteger idx, BOOL *stop) 33 { 34 NSLog(@"%ld - %@", idx, obj); 35 36 37 if (idx == 0) 38 { 39 // 停止遍历 40 *stop = YES; 41 } 42 43 }]; 44 45 46 // void ^(myblock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *stop) 47 // { 48 // NSLog(@"%ld - %@", idx, obj); 49 // 50 // 51 // if (idx == 0) 52 // { 53 // // 停止遍历 54 // *stop = YES; 55 // } 56 // }; 57 // 58 // for (int i = 0; i<array.count; i++) 59 // { 60 // // 用来标记是否需要停止遍历 61 // BOOL isStop = NO; 62 // 63 // // 取出元素 64 // id obj = array[i]; 65 // 66 // myblock(obj, i, &isStop); 67 // 68 // 69 // if (isStop) 70 // { 71 // break; 72 // } 73 // } 74 75 }
可变数组的基本使用
1 void use3() 2 { 3 NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil]; 4 5 // 添加元素 6 [array addObject:[[Person alloc] init]]; 7 8 [array addObject:@"jack"]; 9 10 // 删除元素 11 //[array removeAllObjects]; 12 // 删除指定的对象 13 // [array removeObject:@"jack"]; 14 [array removeObjectAtIndex:0]; 15 16 // 错误写法 17 // [array addObject:nil]; 18 19 20 NSLog(@"%@", array); 21 22 NSLog(@"%ld", array.count); 23 }
注意:
1 void use4() 2 { 3 // @[] 只创建不可变数组NSArray 4 /* 错误写法 5 NSMutableArray *array = @[@"jack", @"rose"]; 6 7 [array addObject:@"jim"]; 8 */ 9 10 11 //NSArray *array = @[@"jack", @"rose"]; 12 }
2、NSSet/NSMutableSet
NSSet和NSArray的对比
1> 共同点
* 都是集合,都能存放多个OC对象
* 只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)
* 本身都不可变,都有一个可变的子类
2> 不同点
* NSArray有顺序,NSSet没有顺序
1 // set的基本使用 2 void test() 3 { 4 NSSet *s = [NSSet set]; 5 6 NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil]; 7 8 // 随机拿出一个元素 9 NSString *str = [s2 anyObject]; 10 11 NSLog(@"%@", str); 12 13 //NSLog(@"%ld", s2.count); 14 }
1 void test2() 2 { 3 NSMutableSet *s = [NSMutableSet set]; 4 5 // 添加元素 6 [s addObject:@"hack"]; 7 8 // 删除元素 9 // [s removeObject:(id)]; 10 }
3、NSDictionary/NSMutableDictionary
1 void use() 2 { 3 /* 4 字典: 5 6 key ----> value 7 索引 ----> 文字内容 8 9 里面存储的东西都是键值对 10 11 12 */ 13 14 // NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"]; 15 16 17 // NSArray *keys = @[@"name", @"address"]; 18 // NSArray *objects = @[@"jack", @"北京"]; 19 20 // NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; 21 22 23 /* 24 NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 25 @"jack", @"name", 26 @"北京", @"address", 27 @"32423434", @"qq", nil];*/ 28 29 30 NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"}; 31 32 // id obj = [dict objectForKey:@"name"]; 33 34 id obj = dict[@"name"]; 35 36 NSLog(@"%@", obj); 37 38 39 40 // 返回的是键值对的个数 41 NSLog(@"%ld", dict.count); 42 }
1 void use2() 2 { 3 NSMutableDictionary *dict = [NSMutableDictionary dictionary]; 4 5 // 添加键值对 6 [dict setObject:@"jack" forKey:@"name"]; 7 8 9 [dict setObject:@"北京" forKey:@"address"]; 10 11 [dict setObject:@"rose" forKey:@"name"]; //覆盖 12 13 14 // 移除键值对 15 // [dict removeObjectForKey:(id)]; 16 17 18 NSString *str = dict[@"name"]; 19 20 21 //NSLog(@"%@", str); 22 23 NSLog(@"%@", dict); 24 25 26 //NSLog(@"%@", @[@"jack", @"rose"]); 27 }
1 void use3() 2 { //错误写法 3 NSMutableDictionary *dict = @{@"name" : @"jack"}; 4 5 6 [dict setObject:@"rose" forKey:@"name"]; 7 }
1 void use4() 2 { 3 // 字典不允许有相同的key,但允许有相同的value(Object) 4 // 字典的无序的 5 NSDictionary *dict = @{ 6 @"address" : @"北京", 7 @"name" : @"jack", 8 @"name2" : @"jack", 9 @"name3" : @"jack", 10 @"qq" : @"7657567765"}; 11 12 // NSArray *keys = [dict allKeys]; 13 // 14 // for (int i = 0; i<dict.count; i++) 15 // { 16 // NSString *key = keys[i]; 17 // NSString *object = dict[key]; 18 // 19 // 20 // NSLog(@"%@ = %@", key, object); 21 // } 22 23 24 [dict enumerateKeysAndObjectsUsingBlock: 25 ^(id key, id obj, BOOL *stop) { 26 NSLog(@"%@ - %@", key, obj); 27 28 // *stop = YES; 29 }]; 30 }
4、集合总结
1>NSArray\NSMutableArray
* 有序
* 快速创建(不可变):@[obj1, obj2, obj3]
* 快速访问元素:数组名[i]
2>NSSet\NSMutableSet
* 无序
3>NSDictionary\NSMutableDictionary
* 无序
* 快速创建(不可变):@{key1 : value1, key2 : value2}
* 快速访问元素:字典名[key]
*/
补充:
1 #import <Foundation/Foundation.h> 2 3 int main() 4 { 5 NSArray *persons = @[ 6 @{@"name" : @"jack", @"qq" : @"432423423", @"books": @[@"5分钟突破iOS编程", @"5分钟突破android编程"]}, 7 @{@"name" : @"rose", @"qq" : @"767567"}, 8 @{@"name" : @"jim", @"qq" : @"423423"}, 9 @{@"name" : @"jake", @"qq" : @"123123213"} 10 ]; 11 12 // 13 // NSDictionary *jim = persons[2]; 14 15 16 // 17 NSString *bookName = persons[0][@"books"][1]; 18 NSLog(@"%@", bookName); 19 //NSArray *array = persons[0][@"books"]; 20 21 //NSLog(@"%@", array); 22 23 // 先取出1位置对应的字典 24 // 再取出字典中qq这个key对应的数据 25 //NSLog(@"%@", persons[1][@"qq"]); 26 27 // NSLog(@"%@", jim); 28 return 0; 29 }