Foundation框架中常用的类有:NSString、NSArray、NSSet、NSDictionary 以及它们对应的子类 NSMutableString、NSMutableArray、NSMutableSet、NSMutableDictionary,父类统一为不可变而子类可变,还包括NSDate、NSObject
可变和不可变的区别是对象内容的可变和不可变,子类既然是继承父类那么子类可以使用父类中的任意方法
1.NSString类的操作
使用NSString类的对象初始化方法创建字符串 // 创建无参数的字符串
NSString *str2 = [[NSString alloc] initWithString:@"Jack"];//创建带参数的字符串NSString *str3 = [[NSString alloc] initWithFormat:@"age is %d",10];//C字符串 转换为 OC字符串NSString *str4 = [[NSString alloc] initWithUTF8String:"Rose"];//OC字符串 转换为 C字符串constcharc =[str4 UTF8String];//读取文件内容第一种方式:读取桌面下 getWeather.xml文件里的所有内容NSString *str5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/getWeather.xml"
encoding:NSUTF8StringEncoding error:nil];// NSUTF8StringEncoding 适用于使用中文的编码格式//读取文件内容第二种方式//URL:资源路径 格式为:协议头:// 比如本地文件的URL格式:file:// 网络文件的URL格式:http:// 服务器文件的URL格式:ftp://
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/getWeather.xml"];
//如果访问网络就可以定义:http://www.baidu.com
NSString *str6 =[[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"/n%@",str6);
使用NSString类方法创建字符串//创建无参数的字符串NSString *str2 = [NSString stringWithString:@"Jack"];//创建带参数的字符串NSString *str3 = [NSString stringWithFormat:@"age is %d",10];//C字符串 转换为 OC字符串NSString *str4 = [NSString stringWithUTF8String:"Rose"];//读取文件内容第一种方式:读取桌面下getWeather.xml文件里的所有内容NSString *str5 = [NSString stringWithContentsOfFile:@"file:///Users/apple/Desktop/getWeather.xml"encoding:NSUTF8StringEncoding error:nil];// NSUTF8StringEncoding 适用于使用中文的编码格式//读取文件内容第二种方式:读取桌面下getWeather.xml文件里的所有内容NSURL *url = [NSURL URLWithString:@"file:///Users/apple/Desktop/getWeather.xml"];
NSString*str6 = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
可以看出实现同一个功能NSString提供了对象方法和类方法两种解决方式而类方法快捷方便,因此在实际开发中推荐使用类方法来操作字符串
将字符串写入到一个文件里//给目标文件中写入字符串,两种写入方式在写入之前都会将文件中的内容全部清空后再写入//第一种写入方式//atomically参数指写入不成功时要不要停止[@"java,iOS"writeToFile:@"/Users/apple/Desktop/getWeather.xml"atomically:YES encoding:NSUTF8StringEncoding error:nil];//第二种写入方式NSString *content =@"iOS,Java";//NSURL提供了直接定义本地URL的类方法NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/getWeather.xml"];
[content writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
2.NSMutableString类的操作
NSMutableString继承自NSString那么NSMutableString可以使用NSString类中的任意方法NSMutableString提供了自己独有的方法NSString *str = [NSString stringWithFormat:@"My age is 10"];
NSString*str2 = [str stringByAppendingString:@"11 12"];
NSLog(@"%@",str2);//打印:My age is 10 11 12NSMutableString*mutalbeStr = [NSMutableString stringWithFormat:@"My age is 10"];
[mutalbeStr appendString:@"11 12"];//appendString方法没有返回值,说明是直接str字符串后面进行拼接NSLog(@"%@",mutalbeStr);//打印:My age is 10 11 12
//可以看出:NSString一旦定义了str字符串它本身就不可变了,虽然NSString类方法也提供了拼接的方法如stringByAppendString方法但是它返回的是一个新的字符串。而NSMutableString提供的拼接方法appendString方法是在原有的字符串上直接拼接它没有返回值。这就是可变和不可变字符串的本质
//NSMutableString 提供了删除方法,比如说要删掉上面可变字符串中的11有两种方式://第一种 必须要清楚要删除内容的location和length,11在整个字符串中的loc = 11 length = 2 (不推荐使用)//[mutalbeStr deleteCharactersInRange:NSMakeRange(13, 2)];//第二种:先获取要删除内容的范围,然后删除范围内的字符串NSRange range = [mutalbeStr rangeOfString:@"11"];
[mutalbeStr deleteCharactersInRange:range];
NSLog(@"%@",mutalbeStr);//打印:My age is 10 12
2.OC集合类的操作
(1)OC集合类包括NSArray,NSSet,NSDictionary都是以面向对象的方式操作数组,而且OC数组不像C语言中的数组只能存放同一种数据类型,它可以 存放任意类型的对象,但是不能存放非OC对象类型如基本数据类型int,struct,enum等
(2)OC数组是以对象的方式存在,因此在创建的时候需要为创建的对象前面加*
(3)NSArray数组一旦创建就决定了是不是可变,而且永远是可变或不可变
(4)NSArray数组和子类NSMutableArray的基本操作
//使用NSArray的类方法arry创建个数组//创建时定义为空数组,那么array数组将永远是空数组NSArray *array = [NSArray array];
NSArray的常见操作://创建数组对象有两种方式//第一种方式:NSArray *array = [NSArray arrayWithObjects:@"Jack",nil];//数组中包含了两个NSString对象 nil是用来标识数组元素结束的标识//因此OC数组中不能存放空对象NSArray *array1 = [NSArray arrayWithObjects:@"Jack",@"Rose", nil];//第二种方式:(推荐使用)NSArray *array2 = @[@"Jack",@"Rose"];
//获取数组的长度array1.count;NSUInteger count =[array1 count];
NSLog(@"%ld",count);
//访问数组中的对象的两种方式NSString *str1 = [array1 objectAtIndex:0];//数组中索引为1的对象,OC中提供的方法 返回:JackNSString *str2 = array1[0];//编译器特性其实还是转为上面的形式来访问 返回:Jack
// 遍历数组的三种方式//第一种:for(inti =0; i<array1.count; i++) {
NSLog(@"%@",array1[i]);//数组中存放的是对象可以用%@输出if(i ==0) {
break;
}
}
//第二种:将array1数组中的每个对象拿出来赋给obj然后依次打印for(idobjinarray1) {//id obj 代表数组中的对象//获取obj对象在数组中的索引NSUInteger index =[array1 indexOfObject:obj];
NSLog(@"%ld-->%@",index,obj);
}
//第三种:使用Block 每次从数组中遍历一个元素后就传递给block,block也相应的执行一次//block中的id obj对应数组中的元素,NSUInteger idx对应数组中元素的索引 BOOL用来停止遍历[array1 enumerateObjectsUsingBlock:^(idobj, NSUInteger idx, BOOL *stop) {
NSLog(@"%ld-->%@",idx,obj);//如果索引为0 立即停止遍历if(idx ==0) {*stop =YES;
}
}];
NSMutableArray的基本操作:// 创建可变数组
NSMutableArray *mutableArray =[NSMutableArray array];
//NSMutableArray*mutalbeArray2 = @[@"张三",@"李斯"]; 注意:@[]返回的是不可变NSArray数组 这样会报错
// 为可变数组增加任意对象
Person *person =[[Person alloc] init];[mutableArray addObject:person];
[mutableArray addObject:@"Jack"];
[mutableArray addObject:@"John"];//[mutableArray addObject:10]; 数组中不可以存放基本数据类型
//从数组中删除指定的元素[mutableArray removeObject:@"John"];
[mutableArray removeObjectAtIndex:0];//将数组中的元素全部删除[mutableArray removeAllObjects];
(5)NSSet数组和子类NSMutableSet的基本操作
NSSet和NSArray都是不可变数组,一旦创建就无法改变。NSSet是无序的集合简单操作://创建NSSet集合NSSet *set= [NSSetset];//一旦创建为空永远为空NSSet *set2 = [NSSet setWithObjects:@"Jack",@"Rose",@"Jim",nil];//随机获取NSSet集合中的元素NSString *str =[set2 anyObject];
NSLog(@"%@",str);
NSMutableSet的简单操作://创建可变set集合NSMutableSet *mutableSet = [NSMutableSetset];//为set添加集合[mutableSet addObject:@"Jack"];
[mutableSet addObject:@"Rose"];//删除元素[mutableSet removeObject:@"Jack"];
(6)NSArray和NSSet数组的对比
都是可以存放任意类型的OC对象的集合,都不能存放基本数据类型本身都是不可变的,但是子类都是可变的NSArray是有序的集合,NSSet是无序的集合(7)NSDictionary和NSMutableDictionary
NSDictionary和它的子类NSMutableDictionary都是以key/value的形式存在,NSDictionary本身为不可变集合NSDictionary也是无序集合字典集合中存储的值是以键值对的形式存在,如果存在相同的key那么后面key的值会被覆盖。但是允许vaule的重复NSDictionary的基本操作//常见创建Dictionary集合的四种方式//1.创建一个空的字典集合类型NSDictionary *dic = [NSDictionary dictionary];//一旦为空 永久为空//2.创建只有一组值的字典集合NSDictionary *dic1 = [NSDictionary dictionaryWithObject:@"Jack"forKey:@"name"];//3.创建多个值的字典集合NSArray *keys = @[@"name",@"address",@"e-mail"];
NSArray*values = @[@"Jack",@"北京",@"jack@163.com"];
NSDictionary*dic3 =[NSDictionary dictionaryWithObjects:values forKeys:keys];//4.通过值/键的方式来创建NSDictionary *dic4 =[NSDictionary dictionaryWithObjectsAndKeys:@"Jack",@"name",@"北京",@"address",@"jack@163.com",@"e-mail",nil];// 5.类似于数组的创建方式 (推荐使用)NSDictionary *dic5 = @{@"name":@"Jack",@"address":@"北京",@"e-mail":@"jack@163.com"};
//取值:根据相应的Key取出对应的值NSString *name = [dic1 objectForKey:@"name"];//返回 Jack
//返回键值对的个数NSUInteger count = dic5.count;//返回 4
// 遍历NSDictionary数组用两种方式://第一种方式://获取字典中所有的键NSArray *allKeys = [dic5 allKeys];//获取的键在数组中是无序的for(inti =0; i < dic5.count; i++) {
NSString*key =allKeys[i];
NSString*value =dic5[key];
NSLog(@"%@-->%@",key,value);
}//第二种方式:将字典中的键值对传递给Block中的key和obj[dic5 enumerateKeysAndObjectsUsingBlock:^(idkey,idobj, BOOL *stop) {
NSLog(@"%@-->%@",key,obj);
// 遍历一次立即停止 *stop = YES;}];
NSMutableDictionary的基本操作//创建可变字典NSMutableDictionary *mutableDic =[NSMutableDictionary dictionary];//NSMutableDictionary *mutableDic2 = @{@"name",@"Rose",@"address",@"北京"}; 错误的写法因为右边返回的是不可变的字典
//为可变字典添加元素[mutableDic setObject:@"Rose"forKey:@"name"];
[mutableDic setObject:@"北京"forKey:@"address"];
//移除[mutableDic removeAllObjects];
[mutableDic removeObjectForKey:@"name"];
//打印NSLog(@"%@",mutableDic);//输出:address = "\U5317\U4eac";name = Rose;\U5317\U4eac 就是北京存储的形式
(8)设计一个通讯录里面包含了四个人的姓名、电话、地址
NSArray *friends =@[
@{@"name":@"张三",@"phone":@"13993214321",@"address":@"北京"},
@{@"name":@"李斯",@"phone":@"13498766789",@"address":@"上海"},
@{@"name":@"王武",@"phone":@"15898766789",@"address":@"天津"},
@{@"name":@"赵柳",@"phone":@"18798766789",@"address":@"南京"}];//获取‘李斯’的通讯录信息NSDictionary *dic = friends[1];
NSLog(@"%@",dic);