OC进阶(四)
1.协议的补充
#import <Foundation/Foundation.h> //#import "baseProtocol.h" @protocol baseProtocol;//只是告诉编译器有这个协议 @interface Dog : NSObject<baseProtocol> @end
2.NSString的比较
#import <Foundation/Foundation.h> void test(){ NSString *str1 = @"abc"; // a 97 NSString *str2 = @"abc"; // A 65 //取出每个字符的ASCII码值 ,比较ASCII码值大小 //compare方法比较大小 //compare 默认的区分大小写的 //compare 这个函数,不能增加条件 // NSComparisonResult result = [str1 compare:str2]; //比较的时候,不区分大小写,参考字符的个数 NSComparisonResult result = [str1 compare:str2 options:NSCaseInsensitiveSearch|NSNumericSearch]; // switch (result) { case NSOrderedAscending: NSLog(@"str1 < str2 升序"); break; case NSOrderedDescending: NSLog(@"str1 > str2 降序"); break; case NSOrderedSame: NSLog(@"str1 == str2 "); break; default: break; } } int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str1 = @"abc"; // a 97 NSString *str2 = @"abc"; // A 65 NSString *str3 = [NSString stringWithFormat:@"Abc"]; //地址的比较 // "==" 不能够判断字符串是否相等的 //判断字符串内容真正是否相等,使用是 //isEqualToString: //注意:他是区分大小写的 if ([str1 isEqualToString:str3]) { NSLog(@"相等"); }else{ NSLog(@"不相等"); } } return 0; }
3.NSString的前后缀检查和搜索
#import <Foundation/Foundation.h> /* 检测字符串的前缀和后缀 */ void test(){ NSString *url = @"https://www.baidu.com"; //如何检测这个字符串是否是一个网址 //http:// https:// // 检测一个字符串的前缀是否以 http:// 开头 或者 https:// 开头 // [str hasPrefix:@"要检测的内容"]; if([url hasPrefix:@"http://"]||[url hasPrefix:@"https://"]){ NSLog(@"是一个网址"); }else{ NSLog(@"这不是一个网址"); } //检测字符串的后缀 // xxxx.jpg 判断 字符串的后缀是否是".jpg" // xxxx.png // xxxx.jpeg // xxxx.gif NSString *imgName = @"xxxxx.doc"; // [str hasSuffix:@"带检测的后缀"] if([imgName hasSuffix:@".jpg"]||[imgName hasSuffix:@".png"]||[imgName hasSuffix:@".jpeg"]||[imgName hasSuffix:@".gif"]){ NSLog(@"是一个图片"); }else{ NSLog(@"这不是一个图片"); } } int main(int argc, const char * argv[]) { @autoreleasepool { //字符串的查找 // 查找某个字符串在另外一个字符串中首次出现的位置 // 0123456789 //1 @"asdaiosffsdafiosasdfsffitcastasdfasd" //2 @"ios" // 4 3 // 1 rangOfString 2 NSString *str1 =@"asdaiosffsdafiosasdfsffitcastasdfasd"; NSString *str2 =@"cjk"; // 字符串查找 // 查找2 在 1中首次出现的位置 // 如果查找到了,返回2在1中的位置和长度 // 如果查找不到,返回的信息: // location 特别大的数(NSNotFound) 最大的long类型的数 // length 0 // range 结构体变量 NSRange 结构别名 NSRange range = [str1 rangeOfString:str2]; //判断是否查找到了 if(range.location!=NSNotFound){ //range.location 表示字符串首次出现的位置 //range.length 字符串出现的长度(实质上就是子字符串的长度) NSLog(@"%lu,%lu",range.location,range.length); }else{ NSLog(@"在%@中没有找到这个字符串%@",str1,str2); } } return 0; }
4.NSRange的使用
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSRange range; //range 结构体变量 NSRange *r ; // r 结构体指针 //range变量的初始化方式 //1) 通过结构体变量访问成员 range.location = 3; range.length = 2; //2) 结构体变量整体赋值 range = (NSRange){5,3}; NSRange r2 = {4,5}; //最简单的 //3) NSRange r3 = {.location = 3}; //只是给结构体变量中的.location 成员赋值 //4) OC中新增的 //NSMakeRange函数的作用给 NSRange结构体变量赋值 NSRange r4 = NSMakeRange(3, 3); //查看结构体变量的值 NSLog(@"%ld,%ld",r4.location,r4.length); //可以把结构体变量转换为 NSString类型 NSLog(@"%@",NSStringFromRange(r4)); } return 0; }
5.字符串的截取和替换
#import <Foundation/Foundation.h> void test(){ // 01234567890 NSString *str = @"http://www.baidu.com"; //1) 从xx位置开始,到最后结束(包含xx这个位置的字符) NSString *str1 = [str substringFromIndex:5];//从第5个之后 NSLog(@"str1 = %@",str1); //2) 从开始位置,到xx位置结束(不包含xx这个位置) NSString *str2 = [str substringToIndex:5]; NSLog(@"str2 = %@",str2); //3) 截取一个范围 range NSRange r1 = {3,4}; NSString *str3 = [str substringWithRange:r1]; NSLog(@"str3 = %@",str3); } /* 字符串截取的练习 */ void test2(){ NSString *str = @"<iosios>wwoshizifuchuan</iosios>"; // @">" loc+1 NSUInteger loc = [str rangeOfString:@">"].location + 1; //"w"得位置 // @"</" loc NSUInteger len = [str rangeOfString:@"</"].location - loc; //要截取的字符的长度 // 构建 ruange NSRange r2 = {loc,len}; // 截取 NSString *subStr = [str substringWithRange:r2]; NSLog(@"subStr = %@",subStr); } int main(int argc, const char * argv[]) { @autoreleasepool { //字符串的替换 // @"asdfsdafasdfdasdfsa" ----> a 替换成 "*" // @" asdfasfd asdfsadf asdf asdfas asdf asdf asdfa" NSString *str =@"asdfsdafasdfdasdfsa"; // str stringByReplacingOccurrencesOfString:@"源字符串中的内容" withString:@"要替换成新的内容" //把a替换成 * NSString *newStr = [str stringByReplacingOccurrencesOfString:@"a" withString:@"*"]; NSLog(@"newStr = %@",newStr); // 把空格给去掉 str =@" asdfasfd asdfsadf asdf asdfas asdf asdf asdfa"; newStr = [str stringByReplacingOccurrencesOfString:@" " withString:@""]; NSLog(@"newStr = %@",newStr); //将http:**ios.ios.cn*ios*images*content_25.jpg中的*替换为/ str =@"http:**ios.ios.cn*ios*images*content_25.jpg"; newStr = [str stringByReplacingOccurrencesOfString:@"*" withString:@"/"]; NSLog(@"newStr = %@",newStr); // http:** ios.ios.cn *ios*images* content_25.jpg // 1) 空格 替换成空 // 2) 把*替换成/ str = @"http:** ios.itcast.cn *ios*images* content_25.jpg"; newStr = [str stringByReplacingOccurrencesOfString:@" " withString:@""]; newStr = [newStr stringByReplacingOccurrencesOfString:@"*" withString:@"/"]; NSLog(@"newStr = %@",newStr); } return 0; }
6.NSString的其他用法
#import <Foundation/Foundation.h> //字符串转各种数值 void test(){ // str 是一个对象 NSString *str = @"1"; NSString *str2 = @"3.14"; //基本数据类型 int a = 10; //str @"1" ----> 1 int b = [str intValue]; // @"1" --> 1 b = [str2 intValue]; // @"3.14" ---> 3 a = a+b; //a = 13 //这是把str2转换为 float值 float f1 = [str2 floatValue]; //@"3.14" --> 3.14f f1 = f1 + a; //把str2 转换为 double 值 double d1 = [str2 doubleValue]; // @"3.14" --> 3.14 // 3.14+ 3 d1 = d1 + b; NSLog(@"a = %.2f",d1); } int main(int argc, const char * argv[]) { @autoreleasepool { NSString *str = @"a"; int value = [str intValue]; NSLog(@"value = %d",value); // //OC的字符串和 C的字符串互相转换问题 // // char* NSString // //1) C---->OC对象 // // char *s = "zhangsanfeng"; // printf("%s\n",s); // // //思路:创建一个OC的字符串对象,用C语言的字符串创建 // NSString *str = [NSString stringWithUTF8String:s]; // NSLog(@"str = %@",str); // // //2) OC对象 --> C的字符串 // NSString *str2 = @"zbz"; // // 把str2 转 C的字符串 // const char *s1 = [str2 UTF8String]; // printf("s1 = %s\n",s1); } return 0; }
7.NSMutableString 介绍和使用
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //不可变: 字符串占用的 空间 和 字符串 的内容,都不能改变 //可变: 字符串占用的空间和字符串的内容,都可以改变 NSString *str = @"Jack"; //常量区 NSLog(@"str addr =%p",str); str = @"Rose"; NSLog(@"str addr =%p",str); //可变的字符串 NSMutableString *str2 = [NSMutableString stringWithFormat:@"Jack"]; NSLog(@"str2 addr =%p",str2); [str2 appendString:@"&Rose"]; NSLog(@"str2 addr =%p",str2); NSLog(@"str2 = %@",str2); //思考: //创建一个可变的空字符 NSMutableString *str3 = [NSMutableString string]; NSLog(@"str3 = %@",str3); for (int i=0; i<10; i++) { [str3 appendString:@" ios"]; } NSLog(@"str3 = %@",str3); } return 0; }
8.可变字符串的常见的方法
#import <Foundation/Foundation.h> //可变字符串的常见的方法 void test(){ NSMutableString *str = [NSMutableString string]; //1) appendFormat 格式化的添加字符串 // 0123456789 [str appendFormat:@"http://www.baidu.com/%d",100]; //str http://www.baidu.com/100 NSLog(@"%@",str); //2) 删除字符串一部分内容 [str deleteCharactersInRange:NSMakeRange(3, 4)]; NSLog(@"%@",str); //3) 插入一个字符串 [str insertString:@"p://" atIndex:3]; NSLog(@"%@",str); //4) 替换字符串的一部分内容 [str replaceCharactersInRange:NSMakeRange(11, 5) withString:@"ios"]; NSLog(@"%@",str); } int main(int argc, const char * argv[]) { @autoreleasepool { //给可变的字符串赋值一个不可变的值 //错误: // 1)给可变字符串赋值了不可变的值 // NSMutableString = NSString // NSMutableString *str = @"abc"; // [str appendString:@"xxxx"]; NSMutableString *str = [NSMutableString stringWithFormat:@"abc"]; // 2) //string 把原来字符串的内容给覆盖了 str.string = @""; //用空覆盖 [str appendString:@"xxxxx"]; NSLog(@"str = %@",str); } return 0; }
9.NSArray
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //NSArray特点: // 一旦创建成功,内容不可改变 // 只能存放OC对象 //1)创建一个空数组 NSArray *arr1 = [NSArray array]; //2)创建数组,只有一个元素 NSArray *arr2 = [NSArray arrayWithObject:@"1"]; //3)创建数组,有多个元素 // nil 表示数组赋值结束 // 常见写法 NSArray *arr3 = [NSArray arrayWithObjects:@"one",@"two",@1, nil]; NSLog(@"arr3 = %@",arr3); //4)调用对象方法,创建数组 //nil Nil NULL NSNULL NSArray *arr4 = [[NSArray alloc] initWithObjects:@"three",[NSNull null],@"four", nil]; NSLog(@"arr4 = %@",arr4); //5)用一个数组可以创建另外一个数组 NSArray *arr5 = [NSArray arrayWithArray:arr3]; NSLog(@"arr5 = %@",arr5); } return 0; }
10.NSArray常见的方法
#import <Foundation/Foundation.h> //数组的常见的方法 void test(){ NSArray *arr3 = [NSArray arrayWithObjects:@"one",@"two",@1,@"three", nil]; NSLog(@"arr3 = %@",arr3); //1)获取数组的长度 count获取数组的元素的个数 NSLog(@"%ld",arr3.count); //2)根据下标,获取下标对应的对象 NSLog(@"%@",[arr3 objectAtIndex:3]); //3)返回元素的下标 NSUInteger loc = [arr3 indexOfObject:@"three"]; NSLog(@"%ld",loc); //4)数组中是否包含了某个元素 if([arr3 containsObject:@"four"]){ NSLog(@"包含此元素"); }else{ NSLog(@"不包含"); } } int main(int argc, const char * argv[]) { @autoreleasepool { //用简化的方式,来定义和访问数组元素 //1)用简化的方式,定义数组 //格式: @[ 数组元素 ] NSArray *arr = @[@"1",@"one",@"3",@4,@"ONE"]; NSLog(@"arr = %@",arr); NSString *str =[arr objectAtIndex:2]; NSLog(@"%@",str); //2)用简化的方式访问数组元素 str = arr[1]; //C语言形式的数组元素访问 NSLog(@"%@",str); } return 0; }
11.NSArray的遍历方法
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //定义一个数组 NSArray *arr = @[@"one",@"two",@"three",@"four"]; //对数组进行遍历 //1) 普通的方式,通过下标访问 for (int i=0; i<arr.count; i++) { NSLog(@"-> %@",arr[i]); } //2) 快速枚举法 for循环的增强形式 for (NSString * str in arr) { NSLog(@"---> %@",str); } //3) 使用block的方式,进行访问 // 数组元素 元素下标 是否停止 //stop:YES 会停止, stop:NO 不会停止 [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { if(idx == 2){ *stop = YES; //停止 // break; }else{ NSLog(@"idx = %ld,obj = %@",idx,obj); } }]; } return 0; }
12.NSMutableArray的使用
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //数组的使用 //1)创建数组 //i. 空数组 NSMutableArray *arr1 = [NSMutableArray array]; NSLog(@"%p",arr1); //ii.创建的时候初始化一个元素 NSMutableArray *arr2 = [NSMutableArray arrayWithObject:@"one"]; //iii.创建数组的时候,初始化多个元素 NSMutableArray *arr3 = [NSMutableArray arrayWithObjects:@"one",@"two",@3,nil]; //IV . 创建一个数组,并且指定长度, NSMutableArray *arr4 = [NSMutableArray arrayWithCapacity:5]; //2) 添加元素 [arr1 addObject:@"fengjie"]; NSLog(@"%p",arr1); //插入元素到指定的位置 [arr1 insertObject:@"zbz" atIndex:0]; //3) 删除元素 //根据对象内容删除 // [arr1 removeObject:@"zbz"]; //根据位置删除 // [arr1 removeObjectAtIndex:1]; //全部删除 [arr1 removeAllObjects]; //4) 修改元素 //two --> four [arr3 replaceObjectAtIndex:1 withObject:@"four"]; //four --> five //更加简单地方法 arr3[1] = @"five"; NSLog(@"%@",arr3); //5) 查找元素 BOOL isSearch = [arr3 containsObject:@"four"]; NSLog(@"%d",isSearch); //6) 交换元素 // 1 2 3 4 5 // 5 2 3 4 1 //temp = a[0]; //a[0] = a[len-1]; //a[len-1] = temp; NSMutableArray *arr5 =[NSMutableArray arrayWithObjects:@1,@2,@3,@4,@5, nil]; // 可以交换数组元素 [arr5 exchangeObjectAtIndex:0 withObjectAtIndex:4]; NSLog(@"%@",arr5); } return 0; }
13.NSDictionary
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //NSDictionary 不可变的,一旦创建,内容就不能添加\删除(不能改动) //1)创建空字典 NSDictionary *dict1 = [NSDictionary dictionary]; // key value // zs ---> 张三 // ls ---> 李四 // mz ---> 码子 //2)创建只有一组键值对的字典 NSDictionary *dict2 = [NSDictionary dictionaryWithObject:@"zhangsan" forKey:@"zs"]; //3)创建多组键值对的字典 // value值,key值 NSDictionary *dict3 = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"k1",@"value2",@"k2", nil]; //注意; // 字典的key值和value值,都必须是对象 //4)快速创建一个字典 //@{,,key值:value值,,,}; //key值不能重复: //如果重复了,也不会报错 //如果重复了,最后添加的将不能够保存到字典中 NSDictionary *dict4 = @{@"zs":@"zhaosi",@"zs":@"zhangsan",@"ls":@"lisi",@"bz":@"banzhang"}; NSLog(@"%@",dict4); //以%@格式打印字典,控制台输出一个{ } //5)获取字典的长度 NSLog(@"%lu",dict4.count); //6)根据key值取出value值 // zs zhaosi // key NSString *str = [dict4 objectForKey:@"zs"]; NSLog(@"str = %@",str); //7)字典的遍历问题 //第一步:获取所有的key //第二步:根据key获取value // for(NSString *key in dict4){ // NSLog(@"key = %@,value = %@",key,[dict4 objectForKey:key]); // } // key value stop [dict4 enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) { NSLog(@"%@ --> %@",key,obj); }]; } return 0; }
14.NSMutableDictionary
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { //1)可变字典的创建 NSMutableDictionary *dict1 = [NSMutableDictionary dictionary]; //创建空字典 NSMutableDictionary *dict2 = [NSMutableDictionary dictionaryWithCapacity:3]; //2)给可变字典添加键值对 [dict1 setValue:@"zhaosi" forKey:@"ls"];//因为key值重复了,所以添加不上 [dict1 setValue:@"lisi" forKey:@"ls"]; // ls [dict1 setValue:@"liuneng" forKey:@"ln"]; NSLog(@"%@",dict1); //3)删除 // [dict1 removeObjectForKey:@"ls"]; // [dict1 removeAllObjects]; NSLog(@"%@",dict1); //4)修改 // [dict1 setObject:@"zhaosi" forKey:@"ls"]; //简写形式 dict1[@"ls"] = @"xxxxx"; NSLog(@"%@",dict1); //5)查找 //获取所有的key值 NSArray *arr = [dict1 allKeys]; if([arr containsObject:@"ls"]){ NSLog(@"存在ls的key"); } } return 0; }