------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
这节主要是讲一些Foundation框架中常用到的结构体、类,而在c语言中的结构体,日期、数组等集合在OC中却封装成类,这样的好处在学习的过程中也略见它的好处,相信在以后开发中会有更大的作用。
一、结构体
1.NSRange
1.认识 定义
它是一个描述字符串位置范围的一个结构体,内部包含两个变量。location表示第几个字符(从0开始),length表示从location位置开始占几个字符。
如:@“i love oc”这个字符对象,love的范围,可知location=2,lengt=4,它用oc语言表示有下面几种方法
1>NSRange r1={2,4};//表示love的范围 不常用
2>NSRange r2 = {.location = 2, .length = 4}; 不常用
3>NSRange r=NSMakeRange(2,4) 常用
2.查找某个字符串在字符串中的范围
如:查找某个字符窜在str中的范围,如果找不到,length=0,location=NSNotFound
NSString *str = @"i love oc";
NSRange range = [str rangeOfString:@"java"]; 这个NSString对象的方法大可以找到它的范围
NSLog(@"loc = %ld, length=%ld", range.location, range.length);
2.NSPoint ,NSSize,CGRect
1.定义:
NSPoint /CGPoint 它用于表示一个点,包含两个变量,x和y,即坐标上的点位置
NSSize/CGSize 它表示矩形的尺寸大小,包含两个变量,width 和height
CGRect 它表示一个矩形,包含上面CGPoint和 CGSize的两个变量
2.它们常用的表达
1> CGPoint p1 = NSMakePoint(10, 10);
NSPoint p2 = CGPointMake(20, 20) ; 最常用
CGPointZero ;表示原点,使用CGPointZero等的前提是添加CoreGraphics框架
CGPointZero == CGPointMake(0, 0)
2> NSSize s1 = CGSizeMake(100, 50); 常用
NSSize s2 = NSMakeSize(100, 50);
CGSize s3 = NSMakeSize(200, 60);
CGSizeZero
3> CGRect r1 = CGRectMake(0, 0, 100, 50);
CGRect r2 = { {0, 0}, {100, 90}};
CGRect r3 = {p1, s2};
CGRectZero
4>.BOOL b=CGPointEqualToPoint(,) 比较两份点是否为一个点,使用这些CGPointEqualToPoint、CGRectContainsPoint等函数的前提是添加CoreGraphics框架
CGRectContainsPoint 比较这个矩形是否包含这个点
3.将结构体转为字符串
NSString *str = NSStringFromPoint(p1);
NSString *str = NSStringFromSize(s3);
NSString *str = NSStringFromRect(r1);
NSLog(@"%@", str);二、常见类
1.NSString
1.字符串的创建
NSString *s1 = @"jack";
NSString *s2 = [[NSString alloc] initWithString:@"jack"];
NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d", 10];
2. C字符串 转变到 OC字符串
NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];
3.OC字符串 转变到C字符串
const char *cs = [s4 UTF8String];
NSUTF8StringEncoding 用到中文就可以用这种编码
4.加载文件内容和资源
1> NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil];
2> NSString *s6 = [[NSString alloc] initWithContentsOfURL:urlencoding:NSUTF8StringEncoding error:nil];比较常见
NSLog(@"s6=\n%@", s6)
其中的url可以根据想要传入的内容来赋值,它也是一个对象,如:
URL : 资源路径
协议头://路径
file://
ftp://
例如: NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/1.txt"];
NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"];
注意: 一般都会有一个类方法跟对象方法配对
[NSURL URLWithString:<#(NSString *)#>];
[NSString stringWithFormat:@""];
[NSString stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError *__autoreleasing *)#>];
5. 字符串的导出
将某个字符串写入一个文件夹
1> [@"Jack\nJack" writeToFile:@"/Users/apple/Desktop/my.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
其中的yes表示如果传入的过程中出现错误则撤销
2> NSString *str = @"4234234";
NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/my2.txt"];
[str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil
6.NSMutableString
它是可变字符串,也是NSSting的子类,可以在已经存在的字符串对象中添加新的字符。
1>创建一个可变的字符串
NSMutableString *s1 = [NSMutableString stringWithFormat:@"my age is 10"];
2> 拼接内容到s1的后面
[s1 appendString:@" 11 12"];
3> 获取is的范围
NSRange range = [s1 rangeOfString:@"is"];
4> 删除
[s1 deleteCharactersInRange:range];
5> 错误写法:
NSString *s2 = [NSString stringWithFormat:@"age is 10"];
NSString *s3 = [s2 stringByAppendingString:@" 11 12"];
2.NSArry
OC数组,它不能存放nil值,只能存放OC对象、不能存放非OC对象类型,比如int、struct、enum等
1.NSArray的创建
传入单个元素: NSArray *array2 = [NSArray arrayWithObject:@"jack"];
传入多个元素: NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose",person, nil];nil是数组元素结束的标记
快速创建一个NSArray对象 :NSArray *array4 = @[@"jack", @"rose", @"4324324"];
2.NSArray的元素个数
NSLog(@"%ld", array3.count);
3.NSArray中元素的访问
NSLog(@"%@", [array3 objectAtIndex:1])==array3[1];
NSLog(@"%@", array3[0]);
注意:
这个array永远是空数组
NSArray *array = [NSArray array];
4.数组的遍历
数组的遍历有如下几种:
1>
for (int i = 0; i<array.count; i++)
{
NSLog(@"%@", array[i]);
}
2>
id obj代表着数组中的每一个元素
int i = 0;
for (id obj in array)
{
// 找出obj元素在数组中的位置
NSUInteger i = [array indexOfObject:obj];
NSLog(@"%ld - %@", i, obj);
i++;
if (i==1)
{
break;
}
}
3>
// 每遍历到一个元素,就会调用一次block,并且当前元素和索引位置当做参数传给block
[array enumerateObjectsUsingBlock:
^(id obj, NSUInteger idx, BOOL *stop)
{
NSLog(@"%ld - %@", idx, obj);
// if (idx == 0)
// {
// 停止遍历
// *stop = YES;
//}
}];
4>上面数组遍历的另外的形式
void ^(myblock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *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);
if (isStop)
{
break;
}
}
5.NSMutableArryy
可变数组,是NSArry的子类,它可以修改数组中的元素。
1>创建可变数组
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];
2> 添加元素
[array addObject:[[Person alloc] init]];
[array addObject:@"jack"];
3>删除元素
[array removeAllObjects];
删除指定的对象
[array removeObject:@"jack"];
[array removeObjectAtIndex:0];
错误写法
[array addObject:nil];
注意:
@[ ] 只创建不可变数组NSArray
错误写法
NSMutableArray *array = @[@"jack", @"rose"];
[array addObject:@"jim"];
4.NSSet
这个类是一种没有顺序的特殊的数组。1.创建一个NSSet对象
NSSet *s = [NSSet set];
NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];
2.随机拿出一个元素
NSString *str = [s2 anyObject];
3.元素个数
s2.count;
4.NSMutableSet
1>创建可变的NSSet
NSMutableSet *s = [NSMutableSet set];
2> 添加元素
[s addObject:@"hack"];
3> 删除元素
[s removeObject:<#(id)#>];
5.NSSet和NSArray的对比
1> 共同点* 都是集合,都能存放多个OC对象
* 只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)
* 本身都不可变,都有一个可变的子类
2> 不同点
* NSArray有顺序,NSSet没有顺序
5.NSDictionary
顾名思义,这是一个字典类,如字典一样,知道一个字母便可找到对应的许多内容,那么NSDictionary里面放的就是 类似字典的键值。key是索引,value是对应的值。字典的无序的,字典不允许有相同的key,但允许有相同的value(Object)
1.创建一个字典
1>NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
2> NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"jack", @"北京"];
NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
3>NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
@"jack", @"name",
@"北京", @"address",
@"32423434", @"qq", nil ];
4>快速创建
NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"};
2.根据键找到值
id obj = [dict objectForKey:@"name"]== id obj = dict[@"name"];
NSLog(@"%@", obj);
3.返回的是键值对的个数
NSLog(@"%ld", dict.count);
}
4.遍历字典
1>
NSArray *keys = [dict allKeys];
for (int i = 0; i<dict.count; i++)
{
NSString *key = keys[i];
NSString *object = dict[key];
NSLog(@"%@ = %@", key, object);
}
2>
[dict enumerateKeysAndObjectsUsingBlock:
^(id key, id obj, BOOL *stop) {
NSLog(@"%@ - %@", key, obj);
// *stop = YES;
}];
}
5.NSMutableDictionary
1>创建可变的字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
2>添加键值对
[dict setObject:@"jack" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];
3>移除键值对
[dict removeObjectForKey:<#(id)#>];
NSLog(@"%@", dict);
6.数组与字典的混合使用
NSArray *persons = @[
@{@"name" : @"jack", @"qq" : @"432423423", @"books": @[@"5分钟突破iOS编程", @"5分钟突破android编程"]},
@{@"name" : @"rose", @"qq" : @"767567"},
@{@"name" : @"jim", @"qq" : @"423423"},
@{@"name" : @"jake", @"qq" : @"123123213"}
]; //数组里有字典,字典里面有词典
NSDictionary *jim = persons[2]; NSLog(@"%@", jim);表示jim所在的那个字典
NSString *bookName = persons[0][@"books"][1]; NSLog(@"%@", bookName); 先取数组0位置对应的字典,再取出自带里book数组的第2本书
NSArray *array = persons[0][@"books"]; NSLog(@"%@", array); 将书全部放在arry数组里面
NSLog(@"%@", persons[1][@"qq"]); 先取出1位置对应的字典,再取出字典中qq这个key对应的数据
集合的总结:
集合
1.NSArray\NSMutableArray
* 有序
* 快速创建(不可变):@[obj1, obj2, obj3]
* 快速访问元素:数组名[i]
2.NSSet\NSMutableSet
* 无序
3.NSDictionary\NSMutableDictionary
* 无序
* 快速创建(不可变):@{key1 : value1, key2 : value2}
* 快速访问元素:字典名[key]
6.NSNumber
在前面学习的集合的元素只能是对象,但是如果想要把一般数据类型放进去就需要将它们转化成对象才行,OC中的NSNumber就是一般数据类型的类,它可以将一般
数剧类型包装成对象。
1.将基本数据类型转为NSNumber
NSNumber *num = [NSNumber numberWithInt:10];
int=[num intValue];
NSNumber *n = [NSNumber numberWithDouble:10.5];
int d = [n doubleValue];
2.数据转为NSString
int a=20;
NSString *str = [NSString stringWithFormat:@"%d", a]; 这将20转为@"20" 即数据转为string
NSLog(@"%d", [str intValue]);
3.快速转为NSNumber
将各种基本数据类型包装成NSNumber对象
@10.5;
@YES;
@'A'; 注意:@"A"; 它是 NSString对象
将age变量包装成NSNumber对象
int age = 100;
@(age);或者[NSNumber numberWithInt:age];
7.NSDate
OC中将日期也封装成一个NSDate类,是它是一个日期时间类.
1.创建一个时间对象
NSDate *date = [NSDate date];
打印出的时候是0时区的时间(北京-东8区)
NSLog(@"%@", date);
NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date]; 表示从运行到此行代码时间5秒钟后的时间
2. 从1970开始走过的秒数
NSTimeInterval seconds = [date2 timeIntervalSince1970];
3 .日期的格式
可以改变日期的格式
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];
NSLog(@"%@", str);
4.将字符转成日期
NSString *time = @"2011/09/10 18:56";
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy/MM/dd HH:mm";
NSDate *date = [formatter dateFromString:time];
NSLog(@"%@", date)
7.NSValue
NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue。
1.结构体转为NSValue对象
CGPoint p = CGPointMake(10, 10);
将结构体转为Value对象
NSValue *value = [NSValue valueWithPoint:p];
2将value转为对应的结构体
[value pointValue];
NSArray *array = @[value ];