总结一下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"];
}
NSSet和NSArray的不同:其中的数据无序排布,不能有相同的数据存储在其中。
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;
}
NSDictionary使用键(key)——值(value)对来存储数据的,key作为元素的索引来使用,通过key来查找到对应的value。不能在NSDictionary中存在相同的键值对,NSDictionary存储的数据也是无序排布的。
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;
}