Foundation
1.NSRange
NSRange是常用的结构体。NSRange(location,length) location表示的是位置,length表示的是长度范围。用make方法创建常用的结构体。
#import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { NSRange range = {10, 15}; NSRange range1; range1.location = 10; range1.length = 15; NSRange range2 = NSMakeRange(10, 15); NSLog(@"range >>>>> %@", NSStringFromRange(range)); NSLog(@"range1 >>>>> %@", NSStringFromRange(range1)); NSLog(@"range2 >>>>> %@", NSStringFromRange(range2)); NSLog(@"range3 >>>>> %@", NSStringFromRange(NSMakeRange(100, 200))); NSLog(@"range4 >>>>> %@", NSStringFromRange((NSRange){100,200})); // NSPoint point; // NSSize size; // NSRect rect; return 0; }
2.NSString字符串
a. 创造字符串
NSString *[email protected]"hello";
b. 格式化输出字符串
NSString *str3=[NSString [email protected]"hello,%@",@"冀林"];
c. 字符串的长度
NSLog(@"str3‘length>>>>%ld",[str3 length]);
d. 字符串比较
NSString *str1=@"hello"; NSString *str2=@"hello1"; if (str1==str2)比较的是str1和str2的内存地址 字符串内容的比较 if(str1 isEqualToString:str2) 专门的函数比较ASCII码值 NSComparisonResult result =[str1 compare str2 options:NSCaseInsensitiveSearch];不区分大小写,相等返回0 判断附加条件:NSNumericSearch 数字按值来比较,前面的0不影响 @“1000”和@“0001000”相等 NSString *str1=@"12013600"; NSString *str2=@"1360"; NSComparisonResult result =[str1 compare str2 range:NSMakeRange(3,4)]; 一定范围内的比较,返回值为0,相等
e. 字符串的连接
NSString *str1 =@“hello”; NSString *str2 =[str1 stringByAppendingString:@"weiliang"]; NSLog(@"str2>>>%@",str2);输出 helloweiliang NSString *str3 =[@"/users/qingyun" stringByAppendingPathComponent:@"Desktop"]; 自动补全路径格式,输出:/users/qingyun/Desktop
f. 字符串查找
NSString *str1 =@"今天我们学习gcd"; if([str1 containsString:@"gcd"]){ NSLog(@"查到了gcd。。"); } 包含前缀 NSString *str1=@"410xxxxxxxxx"; if([str1 hasPrefix:@"410"]){ NSLog(@"前缀410"); } [email protected]:".exe" 是否包含后缀 .exe 文件扩展名和路径 NSString *str1=@"~/Desktop/test.h"; [str1 pathExtension] 输出str1的文件扩展名h [str stringByExpandingTildeInPath] 展开波浪号的路径 [[str stringByExpandingTildeInPath] stringByAbbreviatingWithTildeInPath] 合闭波浪号
g. 提取子串
NSString *str1=@"hello,yangxu"; NSLog(@"substring>>%@",[str1 substringFromIndex:6]); 输出yangxu NSLog(@"subString>>%@",[str1 substringToIndex:6]); 输出hello, NSLog(@"subString >>> %@", [str21 substringWithRange:NSMakeRange(3, 5)]); 输出lo,ya
2.NSMutableString可变字符串
NSMutableString 继承 NSString
a.创建可变字符串
NSMutableString *mstr = [NSMutableString stringWithCapacity:50]; 预先分配50个空间,最优值50 NSMutableString *mstr = [NSMutableString stringWithString:@"1506"]; NSMutableString *mstr = [NSMutableString stringWithFormat:@"1506-%@-", @"master"]; 格式化输出字符串 1506—master—
b.追加字符串
[mstr appendString:@"zhang"]; NSLog(@"mstr >>> %@", mstr); [mstr appendString:@"qinpei"]; NSLog(@"mstr >>> %@", mstr); 输出 1506—master—zhangqinpei
c.删除指定字符串
[mstr deleteCharactersInRange:NSMakeRange(0, 4)]; NSLog(@"mstr >>> %@", mstr); 输出 -master-zhangqinpei
d.插入
[mstr insertString:@"1506" atIndex:0]; NSLog(@"mstr >>> %@", mstr); 输出 1506—master—zhangqinpei
e.替换
[mstr replaceCharactersInRange:NSMakeRange(5, 6) withString:@"teacher"]; NSLog(@"mstr >>> %@", mstr); 输出 1506—teacher—zhangqinpei
f.格式化追加
[mstr appendFormat:@"-%@",@"stage1"]; NSLog(@"mstr >>> %@", mstr); 输出 1506—teacher—zhangqinpei-stage1
3.数组NSArray
1创建数组
NSArray *arr1 =[NSArray arrayWithObjects:@"帅锋",@"xingchen",@"honghai",@"fusong",nil]; 使用arrayWithObjects:创建数组的时候需要以nil结尾,代表数组结束,所以数组中不能存放nil NSArry *arr1 [email protected][@"帅锋",@"xingchen",@"honghai",@"fusong"]; oc中的c语法,oc2.0加入的 NSArry中只能存放对象,并且对对象的类别没有统一要求 NSLog(@"arr1>>>>%@",arr1); 输出数组
2访问数组
NSLog(@"arr1[2]>>>>%@",arr1[2]); NSLog(@"arr1[2]>>>>%@",[arr1 objectAtIndex:2]);
3长度
NSLog(@"arr1‘length>>>%ld",[arr1 count]); 输出数组大小,结果为:4
4是否包含
if(arr1 containObjiect:@"xingchen")判断是否包含对象@“xingchen”
5遍历数组的方式
A for循环
B 枚举器 正向 反向
C 快速枚举
for(id arrObj in arr1){ NSLog(@"arrobj>>>%@",arrObj); } for(对象类型 中间变量 in 需要遍历的数组) 数组中类型统一的话可以这样 Car *car1 =[Car new]; Car *car2 =[Car new]; Car *car3 =[Car new]; NSArray *arr3 = @[car1,car2,car3]; for (Car *car in arr3){ NSLog("@car>>>%@”,car); } NSArray是不可变数组,不能更改数组中的元素
6数组连接
NSArray *arr4=[arr1 arrayByAddingObject:@"yuanao"];添加一个数组元素 NSArray *arr5=[arr1 arrayByAddingObjectsFromArray:arr2];连接一个数组 变成了一个新的数组,并不是可变的概念
7字符串分割
NSString *names=@"guoyu,zhangting,gejing,chaoya"; NSArray *nameArr=[names componentsSeparatedBystring:@","]; NSLog("nameArr>>>%@",nameArr);用 , 把这个字符串分割成4个对象,一个数组 NSString *names2 =[nameArr componentsJoinedByString:@"-"]; NSLog(@"names>>>%@",names2);用 - 把这个数组四个对象合成一个字符串
4.可变数组NSMutableArray
1 创建可变数组
c语法写的数组是不可变数组,可变数组这样创建:
NSMutableArray *mtArr=[NSMutableArray arrayWithArray:@[@"dongdong",@"xinggui"]]; mtArr[0]=@"qilin";改变数组元素 [mtArr addObject:@"litao"];添加一个数组元素 [mtArr addObjectsFromArray:@[@"sss",@"aaa"]];添加一个数组 [mtArr removeObject:@"qilin"];删除一个数组元素 [mtArr removeObject:@"qilin" inRange:(NSRange)];指定范围删除 [mtArr insertObject:(ID) atIndex:(NSUInteger)];指定为位置插入 [mtArr replaceObjectAtIndex:(NSUInteger) withObject:(id)];指定位置替换
5.字典NSDictionary
键值对 散列表或关联数组。用的是键查询优化存储方式,查找速度快
1创建字典
NSDictionary *dict =[NSDictionary dictionaryWithObjectsAndKeys:@"key",@"value",nil];后面是键,前面是值 NSDictionary *dict =@{ @"name":@"jiaxin", @"age":@"20", @"sex":@"man", @"someone":obj };快速创建字典,新语法
2访问字典
NSLog(@“dict[@\"value\"]>>>>%@”,dict[@"value"]); //通过jian访问值 建名都是字符串,值不一定是字符串 NSlog(@"name>>>%@",[dict valueForKey:@"name"]);
4取所有键名,值
NSLog(@"all keys>>>%@",[dict allKeys]); NSLog(@"all values>>>%@",[dict allValues]);
5字典的遍历
for(NSString *key in dict){ NSLog(@"%@>>>%@",key,dict[key]); }
6.可变字典NSMutableDictionary
1创建可变字典
NSMutableDictionary *mtDict=[NSMutableDictionary dictionaryWithDictionary:dict];
2更改键值内容
mtDict[@"someone"]=@"xulu";建someon的值变成xulu mtDict[@"somebody"]=@"lulu";新建一个somebody键并赋值lulu [mtDict setValue:@"guangzhi" forKey:@"name"];name的值改为guangzhi [mtDict addEntriesFromDictionary:@{@"xxx":@"uuuu",@"yyy":@"fooo"}];直接添加一个字典
3删除字典中的元素也就是键值对
[mtDict removeObjectForKey:@"xxx"]; NSLog(@"mtDict >>>>> %@", mtDict); [mtDict removeObjectsForKeys:@[@"yyy", @"somebody"]]; NSLog(@"mtDict >>>>> %@", mtDict); [mtDict removeAllObjects]; NSLog(@"mtDict >>>>> %@", mtDict);
4复杂格式的字典
NSMutableArray *ar1 = [NSMutableArray array]; NSMutableArray *ar2 = [NSMutableArray array]; NSMutableArray *ar3 = [NSMutableArray array]; NSMutableArray *ar4 = [NSMutableArray array]; NSMutableDictionary *dt1 = [NSMutableDictionary dictionary]; NSMutableDictionary *dt2 = [NSMutableDictionary dictionary]; NSMutableDictionary *dt3 = [NSMutableDictionary dictionary]; NSMutableDictionary *dt4 = [NSMutableDictionary dictionary]; NSDictionary *dt = @{@"xxx":@"xxx", @"yyy":ar1, @"zzz":@{@"z1":@"z1", @"z2":@"z2", @"z3":@[@"2",@"3",@"4",dt1]}}; NSLog(@"key >>>> %@", dt[@"zzz"][@"z3"][3][@"key"]); NSMutableArray *ar = [NSMutableArray array]; [ar addObject:dt]; NSLog(@"ar[0] >>>>> %@", ar[0]); NSMutableDictionary *mtDt = [NSMutableDictionary dictionaryWithDictionary:dt]; [mtDt[@"yyy"] addObject:@"22222"]; mtDt[@"yyy"] = @"qwedq"; mtDt[@"yyyy"] = ar1; [mtDt setValue:@"yy" forKey:@"yyyyy"]; //dt[@"xxx"] = @"qwedq"; NSArray *ar5 = @[ar1, ar2, ar3 ,ar4]; ar5[0][0] = @"00";//ar5 不可变,ar1可变,所以可以给ar5[0][0]赋值
7.装箱拆箱
1 NSValue的装箱与拆箱
typedef struct { int age; int SID; } Student; Student st = {18, 1000001}; //[mtar addObject:st]; // 任意类型C数据类型都可以通过下面的方式装箱,第一个参数对该类型变量取地址,第二个@encode(C数据类型名字) NSValue *stValue = [NSValue valueWithBytes:&st objCType:@encode(Student)]; [mtar addObject:stValue]; NSLog(@"mtar >>>>> %@", mtar); Student st1; [stValue getValue:&st1]; // 对任意c类型数据装箱之后的拆箱方法(以get命名的方法一般都需要出参,所以不要随便写get命名的方法) NSLog(@"st1 >>>> %d,%d", st1.age, st1.SID);
按照NSValue的方式装箱 int aa,获得一个NSValue对象
强制类型转换,得到NSNumber对象aaaValue,强制类型转换之后aaaValue内存空间中只有NSValude部分的值是有效的,其他NSNumber扩展出来的内存空间是无效的
aaaValue 不是一个完整的NSNumber对象,所以不能使用intValue
NSValue是NSNumber的父类,用valueWithBytes方法装箱过的数值并不能调用NSNumber中相应的快速开箱,在数值常量快速装箱的时候,需要在常量末尾加结束标识(整型 L,浮点f)
标量包含:c的字符串以及数值类型还有结构体,这些类型都有快速装箱和开箱的方法,常用结构体也有,所以使用valueWithBytes获得NSValue对象的场合比较少
2 系统的常用结构体的快速装箱和拆箱
NSRect rect = NSMakeRect(10, 10, 100, 100); [mtar addObject:[NSValue valueWithRect:rect]]; [mtar addObject:[NSValue valueWithRange:NSMakeRange(10, 15)]]; [mtar addObject:[NSValue valueWithPoint:NSMakePoint(10, 10)]]; NSValue *rangeVl = [NSValue valueWithRange:NSMakeRange(10, 15)]; NSRange range; [rangeVl getValue:&range];拆箱1 NSRange range1 = [rangeVl rangeValue];拆箱2 常用 NSLog(@"range >>> %@", NSStringFromRange(range)); NSLog(@"range1 >>> %@", NSStringFromRange(range1));
3 @是快速装箱语法
NSArray *arr = @[@1,@2,@3,@4,@1.11F,@‘x‘]; NSLog(@"arr >>>> %@", arr);
4 使用NSNumber装箱与拆箱
NSMutableArray *mtar = [NSMutableArray array]; NSNumber *n1 = [NSNumber numberWithInt:100]; NSNumber *n2 = [NSNumber numberWithChar:‘y‘]; NSNumber *n3 = [NSNumber numberWithFloat:3.14F]; NSNumber *n4 = [NSNumber numberWithBool:YES]; [mtar addObject:n1]; [mtar addObject:n2]; [mtar addObject:n3]; [mtar addObject:n4]; NSLog(@"mtar >>>>> %@", mtar);
5 拆箱
int a = [n1 intValue]; char c = [n2 charValue]; NSString *str = [n3 stringValue]; NSLog(@"str >>> %@", str); NSString *str1 = [@10012311 stringValue]; NSString *str2 = [NSString stringWithFormat:@"%d", 10012311]; NSLog(@"str1 >>> %@", str1); NSString *str3 = @"10012311fsefse"; NSLog(@"int >>>>> %d", [str3 intValue]);
通过NSNumber的方法能够把所有基本数据类型包装成oc对象,在存放到oc数组中。
拆箱操作: int age = [num1 intValue];
NSValue和NSNumber相似,具体来说前者是后者的父类。NSValue可以包装复杂的基本数据类型,如结构体,枚举。