Foundation框架
----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
Foundation框架很常用,开发中几乎都需要用到,所以对这个框架稍微总结一下。对于常用的结构体和类分开说一下会比较好理解的:
foundation常用结构体有这些:
NSRange NSPoint(CGPoint坐标) NSSize NSRect
NSRange r = NSMakeRage(location, length) // 后面的是函数
把结构体转换成字符串可以这么做:
CGPoint p = CGPointMake(10, 54);
NSString *str = NSStringFormPoint(p);
NSString *str = NSStringFormPoint(p);
NSString *str = @"ii love oc"; // 查找某个字符串的范围
NSRange range = [str stringOfString:@"ve o"];
NSLog(@"loc = &ld, length = %ld",range.location, range.length)
注意:函数名:CGPointMake(可以跨平台,尽量使用) 或者 NSMakePoint
如果找不到字符串的话,length = 0, location = NSNotfound = -1;
CGRect r1 = CGRectMake(0, 0, 100 ,193); // 第一二参数是CGPoint,后面的是size
参数亦可:CGRect r1 = CGRectMake{{0, 0}, {100 ,193}};
CGRect r1 = CGRectMake(p1, s1); // 里面的参数代表结构体
坐标是0的时候可以:CGPointZero
使用CG而不是NS的时候,要添加框架进去,不是#import,而是在xcode里面设置添加
常用的foundation类有这些:
NSString // 数组用 @[]
NSArray // 这四个只能存放oc对象,不能放基本数据类型。比如@{10}×
NSSet (加上Mutable可变) // 无论是数组还是字典,快速创建的都只能是父类,子类不能快速创建
NSDictionary // 字典用 @{}
NSNumber / NSValue // @后面跟上一个数字,自动变成[NSNumber numberWithInt:4]对象
NSDate
这些都是固定的不可变的,如果变成NSMutableString(加上Mutable)则是可变,其他都是一样
NSString:
是可以(写入)读取文件:(可以对中文进行编码转换)尽量用URL这个方式读取文件即下面的file换成URL
NSString *cs = [NSString alloc] initWithContentsOfFile:@"文件的绝对路径" encoding:
NSUTF8StringEncoding error: nil];
NSUTF8StringEncoding 用到中文就可以这样编码
NSMutableString可变字符串:
// 创建对象后,可以对这个对象增加和删除字符:
[s appendString:@"内容"];删除换成delete
[s appendString:@"内容"];删除换成delete
注意:创建对象的时候可以不用写alloc init,可以直接调用类方法,因为是返回一个对象的:
[[NSString alloc] initWithFormat:@""];可换成[NSString stringWithFormat:@""];一般类方法名都是和类名相同的
查看一下字符串里面的每一个元素(面向对象的思想):
[content characterAtIndex:(NSUInteger(整数))];
[content characterAtIndex:(NSUInteger(整数))];
数有多少行:更好用的是把代码分割成很多块,标记是\n,返回的是一个数组对象
NSArray * array = [content componentsSeparatedByString:@"\n"];
return array.count; // 这里返回一个int的就可以了
NSArray
OC数组只能存放OC对象,不能存放非OC对象,不能存放空值
创建oc数组:NSArray *a = [NSArray arrayWithObject:@"sdljfef"]; // 加上s就是可以传很多对象
快速创建数组:NSArray *a = @[]; // @就是创建NSArray对象的快捷方式,中括号里面写对象就好
这个快速创建数组的方法“@[]”不适用于NSMutableArray这个数组
读取的时候:两种方法
1 [array objectAtIndex:1]; // 读取第二个对象
2 array[1]; // 这是编译器的特性,会自动转换成上面的方法,以后用这个
遍历OC对象的数组:
- 1 for(int i = 0; i < array.count; i++)
- {
- NSLog(@"%@", array[i]);
- }
- 2(快速遍历) for(id obj in array)
- {
- NSUInteger i = [array indexOfObject:obj];
- NSLog(@"%ld - %@",i, obj);
- }
- 3 [array enumerateObjectUsingBlock:
- ^(id obj, NSUInteger idx, BOOLBOOL *stop)
- {
- NSLog(@"%ld - %@",idx, obj)
- }];
- 第三种方法的本质是:
- void [^myBlock](id, NSUInteger, BOOL*) = ^(id obj, NSUInteger idx, BOOLBOOL *stop)
- {
- NSLog(@"%ld - %@",idx, obj);
- if(idx = 0)
- {
- *stop = YES;
- }
- }
- for(int i = 0; i < array.count; i++)
- {
- BOOL isStop = NO;
- id obj = array[i];
- myBlock(obj, i, &isStop); // 用指针才会改变stop的值,否则是值传递
- if(isStop)
- {
- break;
- }
- }
NSFileManager这个类是只能创建一个对象,调用多少次都是只有一个对象,方式:
// 获取文件管理者
NSFileManager * mgr = [NSFileManager defaultManager];
NSFileManager * mgr = [NSFileManager defaultManager];
判断一个路径是文件还是文件夹:
BOOL dir = NO; // 默认是NO
[mgr fileExistsAuPath:路径 isDirectory:BOOL*];
[mgr fileExistsAuPath:路径 isDirectory:BOOL*];
NSSet
这个是没有顺序的,用法和NSArray相似
创建一个NSSet:NSSet *s = [NSSet setWithObject:@"字符串"];
调用的时候:NSString *str = [s anyOject]; // 只能随机拿数组的元素
NSDictionary:
创建:NSDictionary *dict = @{索引@"" :内容@"";索引 :内容};
NSNumber / NSValue
NSNumber是NSValue的子类,前者只能让数字和字符和BOOL包装成对象,本质是依赖于父类的方法;后者可以把结构体等等基本数据类型包装成对象。
NSDate
- // 这个是DATE转成字符串的形式
- // 显示当前(执行这个代码)的时间
- NSDate *date = [NSDate date];
- // 日期格式化类
- NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
- // y 年 M 月 d 日
- // m 分 s 秒 H (24)时 h (12)时
- formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
- NSString *str = [formatter stringFromDate:date];