• 本章是OC Foundation里面的字符串类和集合类
• 字符串[常用]
• NSString
• 概念:NSString是不可变字符串,所有它所有产生其他字符串方法都是生成一个新的字符串,而不会改变原来字符串
• 创建[常用]
• 字面量
• NSString * str = @"abc"
• 对象方法
• NSString *str = [[NSString alloc]initWithUTF8String:"abc"]
• 类方法
• NSString *str = [NSString stringWithFormat:@"Jack"];
• 区别:通过字面的方式创建出来的对象保存在常量区,通过对象方法和类方法创建出来的对象保存着堆中
• 字符串获取【常用】
• 获取字符串的长度
• str.length
• 获取字符串中某个索引上的字符
• [str characterAtIndex:1]
• 获取子串
• 获取从开始位置到某个索引的子串
• [strsubstringToIndex:2]
• 获取从某个索引开始到字符结尾的子串
• [strsubstringToIndex:2]
• 获取某个区间的子串
• [str substringWithRange:range]
• NSRange
• 它是一个结构体用来描述一个区间
• 两个成员
location
表示从那个位置开始
length
表示从这个位置开始的长度
如:aabbcc 中 ca 子串所在区间就是 location = 2 length = 2
• NSRange的创建
NSRange range = {2,2};
NSRange range;
range.location = 2;
range.length = 2;
• 获取某个子串所在的区间
• 从前往后找找到的第一个子串的所在的区间
• [str rangeOfString:@"it"]
• 可以指定查找方式
• [strrangeOfString:@"it" options:(NSStringCompareOptions)]
• NSStringCompareOptions枚举类型
• NSCaseInsensitiveSearch不区分大小写
• NSLiteralSearch 一个字符一个字符的进行比较,严格区分打小写
• NSBackwardsSearch 从后往前查找
• NSRegularExpressionSearch 使用正则方式查找
• 练习
• 用3种方法将下面字符串中的中文截取出来
• <aabbcc>aabbcc</aabbcc>
• 字符串判断与比较【常用】
• 判断字符串是不为空
• str != nil &&str.length !=0
• 判读两个字符相等
• 判读两个字符串的地址相等
• str1 = str2
• 判断两个字符串内容相等
• [str1 isEqualToString str2]
• 自己实现一个判读字符内容相等的方法
• 第一步:如果两个字符串地址相等返回YES
• 第二步:一个字符一个字符的比较遇到不相等的字符就返回NO
• 第三步:返回YES
• 判断开头结尾
• 判断字符串是否以某个字符串开头
• [strhasPrefix:@"www"]
• 判断字符串是否一个某个字符串结尾
• [strhasSuffix:@"cn"]
• 比较两个字符串
• 从前往后比较严格区分大小写
• [str1 compare:str2]
• NSComparisonResult
• NSOrderedSame
str1 与 str2 内容相等
• NSOrderedAscending
str1 小于 str2
• NSOrderedDescending
str1 > str2
• 带条件的比较
• [str1 compare:str1options:(NSStringCompareOptions)]
• NSStringCompareOptions
• NSCaseInsensitiveSearch
不区分大小写
• NSNumericSearch
用于比较数字字符串,以数值的方式来比较
• 字符串转换【常用】
• 基本数据类型转换字符串
• [NSStringstringWithFormat:@"%d,%f,%lf,%c",10,10.1f,10.2,'a']
• 字符串转基本数据类型
• [str intValue];
• [str floatValue];
• [str doubleValue];
• [str characterAtIndex:0]
• 字符串所有字符全部转小写
• [str lowercaseString]
• 字符串所有字符全部转大写
• [str uppercaseString]
• 字符串每个单词的首字母大写,两个单词之间需使用空格隔开
• [str4 capitalizedString]
• 如:today is good day ->Today Is Good Day
• 把C语言字符串转换为OC字符串
• [NSString stringWithCString:"Jack"encoding:NSUTF8StringEncoding];
• [[NSString alloc]initWithCString:"Jack" encoding:NSUTF8StringEncoding];
• 把OC字符串转换为C语言字符串
• [strcStringUsingEncoding:NSUTF8StringEncoding]
• 字符串替换【常用】
• 注意:此类字符串都是以stringBy开头,此类字符都生成一个新的字符串原有的字符串不变了
• 在原有字符串的末尾拼接另一个字符产生一个新的字符串
• [str1 stringByAppendingString:st2]
• 字符串替换
• 使用某个字符串替换掉原来字符串中某个区间的字符串
• [strstringByReplacingCharactersInRange:(NSRange) withString:(NSString *)]
• 使用一个新的字符串替换掉原来字符串中的某个子串
• str =@"www-aabbcc-cn";
• str2 = [str stringByReplacingOccurrencesOfString:@"-"withString:@"."];
• 删除原字符串中的所有指定的字符
• str = @"www-.aabbcc.-cn";
• str2 = [strstringByReplacingOccurrencesOfString:@"-"withString:@""];
• 【常用】去掉两头的空格
• [strstringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]
• NSCharacterSet
• 代表一类字符,它提供了很多简洁的构造方法
• whitespaceAndNewlineCharacterSet 表示空格和换行符
• whitespaceCharacterSet 表示空格
• characterSetWithCharactersInString: 通过字符串创建一个 NSCharacterSet
• 字符串与路径【不常用】
• 是否是绝对路径
• - (BOOL)isAbsolutePath;
• 最后一部分路径
• - (NSString*)lastPathComponent;
• 删除最后一部分路径
• - (NSString*)stringByDeletingLastPathComponent
• 在原来的路径上拼接一个路径
• - (NSString*)stringByAppendingPathComponent:(NSString *)str
• 获取文件的扩展名
• - (NSString *)pathExtension;
• 删除文件的扩展名
• - (NSString*)stringByDeletingPathExtension;
• 在文件末尾增加一个扩展名
• - (NSString*)stringByAppendingPathExtension:(NSString *)str;
• 字符串与文件【常用】
• 写入文件
• NSError *error;
• [str2writeToFile:@"/Users/lideshan/Desktop/test.txt" atomically:YESencoding:NSUTF8StringEncoding error:&error];
• if (error) {
• NSLog(@"%@",error);
• }else{
• NSLog(@"写入成功");
• }
• 读取文件
• NSError *error;
• NSString *str3 = [NSStringstringWithContentsOfFile:@"/Users/lideshan/Desktop/test.txt" encoding:NSUTF8StringEncodingerror:&error];
• if (error) {
• NSLog(@"%@",error);
• }else{
• NSLog(@"%@",str3);
• }
• 字符串与URL【常用】
• URL
• 概念:Uniform Resource Locator 统一资源定位符
• URL格式:协议头://主机[IP,服务器]/路径
• 互联网
• http://ios.aabbcc.cn/ios/images/content_25.jpg
• http: 协议头,超文本传输协议,用于万维网[互联网]
• ios.itscast.cn 主机域名,代表主机
• /ios/images/content_25.jpg 图片在主机下面的绝对路径
• 本地文件
• file:///Users/lideshan/Desktop/test.txt
• file:协议头,表示文件协议
• 由于文件都在保存在本机上,所以主机名称省略
• 路径:/Users/lideshan/Desktop/test.txt
• 从URL中读取字符串
• + (instancetype)stringWithContentsOfURL:(NSURL*)url encoding:(NSStringEncoding)enc error:(NSError **)error;
• 将字符串写入URL对应的资源中
• - (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)useAuxiliaryFileencoding:(NSStringEncoding)enc error:(NSError **)error;
• NSMutableString
• 概念:表示可变的字符串,你可以在原来的串上添加、修改、删除操作,它使NSString的子类
• 末尾拼接字符串
• - (void)appendString:(NSString *)aString;
• - (void)appendFormat:(NSString *)format, ...
• 练习:1.利用NSString将10个aabbcc拼接起来, 中间用空格隔开, 最后写入文件中
• 2..利用NSMutableString将10个aabbcc拼接起来, 中间用空格隔开, 最后写入文件中
• 在某个位置插入一个字符串
• - (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
• 使用新字符串替换字符串中的已有字符串
• - (void)replaceCharactersInRange:(NSRange)range withString:(NSString*)aString;
• - (NSUInteger)replaceOccurrencesOfString:(NSString *)target withString:(NSString *)replacement options:(NSStringCompareOptions)options range:(NSRange)searchRange;
• 删除某个区间的字符串
• - (void)deleteCharactersInRange:(NSRange)range;
• NSString转NSMutableString
• - (void)setString:(NSString *)aString;
• strM.string = @"abc";
• 集合类【常用】
• 特点
• 用于存储多个OC对象,相当于存储对象的容器,我们也称它们为容器类
• 只能存放OC对象不能存放基本数据类型、结构体、枚举
• 数组
• 概念:有序的对象集合,可以存放任意的OC对象
• 特点
• 同一数组中可以存放不同的类型的对象
• 同一个对象可以被存入数组中多次
• 不能存放基本数据类型,基本数据类型需要转换成其包装类型,然后再存放到数组中
• 数组中的元素是有序的
• 通常我们在一个数组中只存储一种类型的对象,便于批量操作
• NSArray
• 概念:不可变数组,一经创建就不能添加,删除,修改其中的元素,
• 创建
• 类方法
• NSArray *array = [NSArray arrayWithObjects:@1,@2,@3,nil];
• 初始化方法
• NSArray *array = [[NSArray alloc] initWithObjects:p1,p2,nil];
• 快捷方式
• NSArray *array = @[@1,@2,@3];
• 访问其中的元素
• 通过对象方法
• [array objectAtIndex:0]
• 快捷方式
• array[0]
• 获取数组的长度
• [array count]
• array.count
• 判断数组中是否包含某个对象
• [array containsObject:p1]
• 这里是通过调用isEqual:方法来判断对象是否相等的
• 遍历数组
• 普通的for 循环
• 增强的for循环
• for (CZPerson*p in array) {
• NSLog(@"%@",p.name);
• }
• 使用block的方式
• [array enumerateObjectsUsingBlock:^(CZPerson *person, NSUIntegeridx, BOOL *stop) {
• NSLog(@"index =%zd,name = %@",idx,person.name);
• }];
• 使用枚举器【几乎不用】
• NSEnumerator *enumer = [array objectEnumerator];
• CZPerson *person;
• while (person = [enumer nextObject]){
• NSLog(@"name =%@",person.name);
• }
• 让数组中的所有元素执行某个方法
• [array makeObjectsPerformSelector:@selector(run)];
• [array makeObjectsPerformSelector:@selector(eat:) withObject:@"狗不理包子"];
• 排序
• 使用选择器进行排序
• 要求数组中的对象必须实现该选择器对应的方法,返回一个排好序的数组
• NSArray *sortedArray = [array sortedArrayUsingSelector:@selector(compare:)];
• 使用比较器block
• 要求该block种必须返回
• NSComparisonResult枚举的成员
• NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(CZPerson* obj1, CZPerson * obj2) {
• return [obj1.namecompare:obj2.name];
• }];
• 使用属性描述器
• 这里属性必须是可排序的
• 按照顺序比较各个属性
• NSArray *array = [[NSArray alloc] initWithObjects:p1,p2,nil];
• NSSortDescriptor *d1 = [NSSortDescriptorsortDescriptorWithKey:@"age" ascending:YES];
• NSSortDescriptor *d2 = [NSSortDescriptorsortDescriptorWithKey:@"name"ascending:YES];
• NSArray * sortedArray = [array sortedArrayUsingDescriptors:@[d1,d2]];
• 数组与字符串
• 字符串转数组
• NSString *str = @"a,b,c,d";
• NSArray *arr = [str componentsSeparatedByString:@","];
• 数组转字符串
• NSString *str1 = [array componentsJoinedByString:@"-"];
• 数组与文件
• 数组写入文件
• [arr writeToFile:@"/Users/lideshan/Desktop/test.txt" atomically:YES];
• 从文件中读取数组
• NSArray *array = [NSArrayarrayWithContentsOfFile:@"/Users/lideshan/Desktop/test.txt"];
• NSMutableArray
• 概念:可变数组,继承NSArray
• 可变数组支持插入,删除,修改的操作
• 创建
• 快捷构造方法【常用】
• 创建一个空数组,数组容量为0
• NSMutableArray *arrayM = [NSMutableArrayarray]
• 创建一个容量为10的空数组
• 这个容量并不是说数组中只能存放10个元素
• 而是一开始就将数组初始化为10个元素,不够用可以动态的增加,这样可以提高效率
• NSMutableArray *arrayM = [NSMutableArrayarrayWithCapacity:10];
• 初始化方法【不常用】
• [[NSMutableArray alloc] init];
• 注意:可变数组不能使用@[p1,p2]方式创建,这种简便的方式只能用于创建不可变数组
• 在末尾添加元素
• [arrayM addObject:p1];
• 在某个索引插入元素
• [arrayM insertObject:p1atIndex:1];
• 删除元素
• 删除某个索引位置的元素
• 注意不要让数组下标越界
• [arrayM removeObjectAtIndex:1]
• 删除某个对象,
• 根据isEqual方法进行比较与给定对象相等的都会被删除
• [arrayM removeObject:p1]
• 删除数组中某个区间的元素
• 注意不要让数组下标越界
• NSRange range = {1,1};
• [arrayM removeObjectsInRange:range];
• 清空数组
• [arrayM removeAllObjects];
• 遍历并删除数组
• 不可以使用枚举器的方式遍历的同时删除数组
• 不可以forin的方式遍历的同时删除数组
• 不可以使用block的方法遍历的同时删除数组
• 可以通过普通的for循环遍历的同时删除数组
• 删除一个元素后要把i--
• for (int i = 0; i < arrayM.count;i++) {
• CZPerson *person = arrayM[i];
• if (person.age== 0) {
• [arrayM removeObjectAtIndex:i];
• i--;
• }
• }
•
• 可以通过先把要删除的数组放到一个新的数组中来,遍历完之后再删除它
• NSMutableArray *temp = [NSMutableArrayarray];
• for (CZPerson*person in arrayM) {
• if (person.age== 0) {
• [temp addObject:person];
• }
• }
• [arrayM removeObjectsInArray:temp];
• NSArray 转NSMutableArray
• - (void)setArray:(NSArray *)otherArray;
• arrayM.array = @[@1,@2];