总结一下Foundation框架中常用的三个类:NSArray、NSSet、NSDictionary的常用属性和方法
NSArray、NSSet、NSDictionary只能存储OC对象,不能存储基本数据类型(int , char , double , float , BOOL , enum(枚举))和结构体类型。实际使用时可以将基本数据类型转换成NSNumber类型。
NSArray:OC中的数组,其中的数据有序排列,可有重复数据,容量大小固定,NSMutableArray是其子类,容量大小可变。他们能存储不同类型的OC对象,但是不能存储nil和基本数据类型的数据以及结构体类型的数据。
//数组的创建 void arrayCreate(void) { //表示创建一个有两个元素的数组,nil代表数组结束的标记,并不是数组的元素 NSArray *array = [[NSArray alloc] initWithObjects:@"kathy", @"Tom", nil]; //NSArray *array1 = [NSArray arrayWithArray:array]; //[NSArray alloc] initWithArray] Person *p = [[Person alloc] init]; p.age = 10; //OC数组中可以存储不同类型的OC对象,不能存储基本类型数据。 char *str = "hello"; NSArray *array1 = [NSArray arrayWithObjects:@"kathy", p, nil]; //NSArray类中的description方法分别调用了每一个元素所属类的description方法。 //NSLog(@"%@", array1); //新语法创建的OC数组-->编译器行为自动转化 NSArray *array2 = @[@"kathy", @"hello", p]; //访问数组元素 NSLog(@"数组的第一个元素:%@", [array2 lastObject]); NSLog(@"数组的第二个元素:%@", [array2 objectAtIndex:1]); //新语法-->自动转化成objectAtIndex的方法调用 NSLog(@"数组的第二个元素:%@", array2[1]); } //数组的遍历 void arrayEnumerate(void) { Person *p = [[Person alloc] init]; p.age = 10; NSArray *array = @[@"kathy", @"hello", p]; //1.普通遍历 // for (NSUInteger i = 0; i < array.count; i++) { // // NSLog(@"%lu:%@", i, array[i]); // } //2.快速遍历:效率更高 for (id object in array) { NSInteger i = [array indexOfObject:object]; NSLog(@"%li:%@", i, object); } //3.block遍历 } void mutableArrayUse(void) { NSMutableArray *mArray = [NSMutableArray arrayWithCapacity:5]; [mArray addObject:@"kathy"]; [mArray addObject:@"hello"]; [mArray addObject:@"kathy"]; NSLog(@"count:%lu",mArray.count); //数组实际元素的个数,capacity:预留的空间 //NSMutableArray *mArray2 = @[@"kathy", @"Tom"]; //通过新语法创建的数组类型为NSArray,即不可变数组,不能调用NSMutableArray中新增的方法 //[mArray2 addObject:@"work"]; NSArray *array = @[@"kathy", @"Tom"]; NSMutableArray *mArray2 = [NSMutableArray arrayWithArray:array]; [mArray2 addObject:@"work"]; NSLog(@"%@", mArray2); //插入元素 [mArray2 addObject:@"tengteng"]; //删除元素 [mArray2 removeObject:@"tengteng"]; }
NSMutableSet是其子类,是可变存储空间的集合。
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //1.Set的创建 NSSet *s1 = [NSSet set]; //空的Set NSSet *s2 = [NSSet setWithObjects:@"kathy", @"Mark", nil]; NSArray *array = @[@"kathy", @"kathy", @"Mark"]; //数组转化为集合,其中相同个的元素会丢失 NSSet *s3 = [NSSet setWithArray:array]; NSLog(@"%@", s3); //2.NSSet转化成NSArray NSArray *array2 = [s3 allObjects]; //3.元素的个数 NSUInteger count = s3.count; //4.访问Set中第一个元素 NSLog(@"%@", array[0]); //不能使用下标来访问Set中的元素,因为其排布是无序的。 // NSLog(@"%@", s3[0]); //随机取出Set中的某一个元素 NSLog(@"%@", [s3 anyObject]); //如果想确定取出Set中的某一个元素,可以先将其转化为NSArray,再根据下标取出某个元素 //5.遍历Set中所有的元素 for (NSString *str in s3) { NSLog(@"%@", str); } //比较NSSet和NSArray: 面试题目 // 1.数组中的元素有序,Set中的元素无序 // 2.数组可以重复存入相同值的对象,而Set不可以。 } return 0; }
NSMutableDictionary是可变存储容量的字典,是NSDictionary的子类。
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //练习:五个同学和相关信息 NSArray *students = @[ @{@"name": @"jack", @"qq" : @"1233444", @"age" : @20, @"phoneNumber" : @[@"89089000", @"1345678", @"1233445"] }, @{@"name": @"Tom", @"qq" : @"1789008", @"age" : @30, @"phoneNumber" : @[@"89089001", @"1345345", @"179995"] }, @{@"name": @"Jim", @"qq" : @"10988444", @"age" : @40, @"phoneNumber" : @[@"899349289", @"193483988", @"1249584395"] }, @{@"name": @"Kathy", @"qq" : @"1213444", @"age" : @50, @"phoneNumber" : @[@"890890780", @"13494978", @"120049445"] } ]; //获取到字典数组的第一个元素 NSDictionary *jack = students[0]; NSLog(@"%@", jack); //获取到第二个同学的qq NSDictionary *tom = students[1]; NSString *qq = tom[@"qq"]; NSLog(@"%@", qq); //第三个同学的所有电话 NSArray *phones = students[2][@"phoneNumber"]; NSLog(@"%@", phones); //第四个同学的寝室电话 NSString *roomPhone = students[3][@"phoneNumber"][2]; NSLog(@"%@", roomPhone); //1.创建NSDictionary //存储一个人的相关信息:name, address, qq NSDictionary *dict1 = [NSDictionary dictionaryWithObjectsAndKeys:@"kathy", @"name", @"hangzhou", @"address", @"213456", @"qq", nil]; NSLog(@"%@", dict1); //新语法 NSDictionary *dict2 = @{ @"name" : @"kathy", @"address" : @"Hangzhou", @"qq" : @"13344" }; //2.访问元素 //通过Key获取值 NSString *object = [dict2 objectForKey:@"name"]; NSLog(@"%@", object); //新语法:key相当于查找元素的索引 NSString *object1 = dict2[@"name"]; NSLog(@"%@", object1); //3.字典的遍历 NSArray *keys = [dict2 allKeys]; //获取到所有的key for (NSInteger i = 0; i < dict2.count; i++) { NSString *key = keys[i]; NSString *object = dict2[key]; //根据key获取值 NSLog(@"%@:%@", key, object); } for (NSString *key in dict2) { NSLog(@"%@:%@", key, dict2[key]); } //4可变字典 NSMutableDictionary *dict3 = [NSMutableDictionary dictionaryWithCapacity:3]; //字典中不允许出现key值相同的键值对 [dict3 setObject:@"kathy" forKey:@"name"]; [dict3 setObject:@"hangzhou" forKey:@"address"]; [dict3 setObject:@"Tom" forKey:@"name"]; NSLog(@"%@", dict3); //用新语法创建的字典是一个不可变字典 NSDictionary *dic5 = @{ @"name" : @"kathy", @"address" : @"Hangzhou", @"qq" : @"13344" }; //[dic5 setObject:@"135889" forKey:@"tel"]; NSMutableDictionary *dic6 = [NSMutableDictionary dictionaryWithDictionary:dic5]; } return 0; }