——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
Foundation框架简介
框架是由很多类、方法、函数、文档按照一定的逻辑组织起来的集合,以便使开发变得更容易。Mac系统为开发者提供了很多框架,Foundation框架是众多框架的基础框架。之前在学习中我们设计每一个类都要继承一个基类:NSObject,这个基类就位于Foundation框架中。下面就来介绍一下Foundation框架里面的一些常用的结构体和类。
常用结构体
Foundation框架中定义了很多常用的结构体供开发者使用,这些结构体完全采用oc定义,和我们自己定义的结构体没有任何区别,之所以由框架为我们提供是为了简化我们的开发工作。常用的结构体有NSRange、NSPoint、NSSize、NSRect等。
一、
NSRange:
它表示一个范围,比如NSRange r = {2, 6};
第一个数是起始位置,第二个数是长度。oc当中我们可以使用这种方式NSRange range = NSMakeRange(2, 4);
或者NSRange range = CGRangeMake(2, 4);
快速创建一个NSRange结构体。
我们可以利用它保存某个字符串在另一个字符串中的位置。
示例1:
#import <Foundation/Foundation.h>
int main()
{
NSString *str = @"china";
NSRange range = [str rangeOfString:@"in"];
NSLog(@"range.location = %ld, range.length = %ld", range.location, range.length);
return 0;
}
示例1利用NSRange结构体获得了一个字符串在另一个字符串中的起始位置和长度。示例1的运行结果是:
range.location = 2, range.length = 2
二、
NSPoint:
它表示一个点。常用的创建方式是:NSPoint point = NSMakePoint(10, 15);
或者NSPoint point = CGPointMake(10, 15);
。
三、
NSSize:
它表示大小,它的两个参数分别表示x轴和y轴上的一个范围,常用的创建NSSize变量的方式是:NSSize size = NSMakeSize(8, 13);
或者NSSize size = CGSizeMake(8, 13);
。
四、
NSRect:
它表示一个矩形,它有四个参数前两个表示一个点,代表这个矩形的起始位置,后两个表示它的长和宽,NSRect就是NSPoint和NSSize的组合。通常我们这样创建一个NSRect变量:NSRect rect = NSMakeRect(0, 0, 5, 9);
或者NSRect rect = CGRectMake(0, 0, 5, 9);
示例2:
#import <Foundation/Foundation.h>
int main()
{
NSPoint p = CGPointMake(1, 2);
NSSize s = CGSizeMake(8, 4);
NSRect r = {p, s};
NSLog(NSStringFromRect(r));//输出变量r的值
NSLog(@"r.origin.x = %.2f, r.origin.y = %.2f, r.size.width = %.2f, r.size.height = %.2f",r.origin.x, r.origin.y, r.size.width, r.size.height);
return 0;
}
示例2简单展示了NSPoint、NSSize和NSRect。运行结果是:
{{1, 2}, {8, 4}}
r.origin.x = 1.00, r.origin.y = 2.00, r.size.width = 8.00, r.size.height = 4.00
字符串
字符串类分为两种:一种是不可变字符串(NSString)另一种是可变字符串(NSMutableString),可变字符串是不可变字符串的子类。
一、
不可变字符串:
初始化字符串:NSString *str=[[NSString alloc] initWithString:@"Objective-C string"];
快速创建字符串:NSString *str=@"OC string";
带格式转换的字符串:NSString *str=[[NSString alloc] initWithFormat:@"age is %d,height is %.2f",19,1.72f];
上面是使用对象方法创建字符串的方式,也可以用类方法创建:
初始化字符串:NSString *str = [NSString stringWithString:@"liyi"];
或者:NSString *str = [NSString stringWithFormat:@"age is %d", 20];
二、
可变字符串和不可变字符串的创建方法一样,只不过换成了NSMutableString类。
示例3:
#import <Foundation/Foundation.h>
int main()
{
NSMutableString *s1 = [NSMutableString stringWithFormat:@"my age is 10"];//创建一个可变字符串
[s1 appendString:@" 11 12"];// 拼接内容到s1的后面
NSRange range = [s1 rangeOfString:@"is"];// 获取“is”的范围
[s1 deleteCharactersInRange:range];//删除“is”
NSString *s2 = [NSString stringWithFormat:@"age is 10"];//创建一个不可变字符串
NSString *s3 = [s2 stringByAppendingString:@" 11 12"];//如果要在s2后面接字符串的话会产生一个新的字符串
NSLog(@"s1=%@, s2=%@", s1, s2);
return 0;
}
示例3展示了可变字符串是如何扩充和缩减的,运行结果是:
s1=my age 10 11 12, s2=age is 10
OC对象数组
Foundation框架中有专门的数组用来存放oc对象的集合,存放oc对象的数组分为可变数组和不可变数组。
一、
创建数组:
1. 对象方法创建:NSArray *array = [[NSArray alloc] initWithObjects:@"abc", @"cde", @"opq", nil];
nil表示元素添加结束。
2. 类方法创建:NSArray *array = [NSArray arrayWithObjects:@"abc",@"cde",@"opq", nil];
通过调用count方法可以获得数组的元素个数:array.count
3. 快速创建一个数组:NSArray *array1 = @[@"jack", @"rose", @"4324324"];
4. 是否包括某个对象:[array containsObject:@"cde"]
这条代码的返回值是:1
5. 对象所在的位置:[array indexOfObject:@"abc"]
这句代码的返回值是:0 即对象@”abc”在数组中的位置是0。
二、
上面这些方法可变数组的创建都可以使用,因为可变数组是继承自不可变数组,可变数组添加或删除元素是对它自身的扩充,不可变数组添加或删除元素会产生一个新的数组。
1. 可变数组添加和删除元素:
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];
[array addObject:@"jack"];//添加一个新的对象
[array removeObjectAtIndex:0];//删除0位置上的元素
2. oc语言中的数组是如何遍历的呢?下面介绍几种遍历oc数组的方法。
1>
示例4:
#import <Foundation/Foundation.h>
int main()
{
NSArray *array = [[NSArray alloc] initWithObjects:@"abc",@"cde",@"opq",@25, nil];
for(int i=0,len=array.count;i<len;i++)
{
NSLog(@"index %d is %@",i,[array objectAtIndex:i]);
}
return 0;
}
示例4利用for循环遍历数组,运行结果是:
index 0 is abc
index 1 is cde
index 2 is opq
index 3 is 25
2>
示例5:
#import <Foundation/Foundation.h>
int main()
{
NSArray *array = [[NSArray alloc] initWithObjects:@"abc",@"cde",@"opq",@25, nil];
for(id obj in array)
{
NSLog(@"index %ld is %@",[array indexOfObject:obj],obj);
}
return 0;
}
示例5利用oc中对for循环的变种使用来遍历数组,运行结果是:
index 0 is abc
index 1 is cde
index 2 is opq
index 3 is 25
3>
示例6:
#import <Foundation/Foundation.h>
int main()
{
NSArray *array = [[NSArray alloc] initWithObjects:@"abc",@"cde",@"opq",@25, nil];
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSLog(@"index %ld is %@",idx,obj);
if(idx==2){//当idx=2时设置*stop为YES停止遍历
*stop=YES;
}
}];
return 0;
}
示例6利用代码块完成了对数组的遍历,运行结果是:
index 0 is abc
index 1 is cde
index 2 is opq
我们看到在NSArray数组中的元素都是顺序存放的,oc中还有一种集合可以无序的存放元素,这就是NSSet类,它也有一个可变的子类NSMutableSet。
NSSet类对象的创建、元素的添加、删除元素的删除都和NSArray一样。它的元素是随机添加的,同样也可以从中随机拿出一个对象。
示例7:
#import <Foundation/Foundation.h>
int main()
{
NSSet *s = [NSSet setWithObjects:@"jack",@"rose", @"jim",nil];//创建一个NSSet数组
NSString *str = [s anyObject];//随机从数组s中拿出一个对象
NSLog(@"%@", str);
return 0;
}
示例7展示了如何从NSSet数组中随机拿出一个对象,运行结果是: jim
字典
字典在我们日常的开发中也是比较常见的,字典是以键值对的形式存放的数组。
常见的创建字典的方式:NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys: @"1",@"a",@"2",@"b",nil];
我们看到每个元素都是两个对象,前面那个是键后面那个是值,根据键就可以找到值。
快速创建字典的方法:NSDictionary *dic =@{@"1":@"a",@"2":@"b",@"3":@"c"};
也可以先创建一个存放键的数组,再创建一个存放值的数组,最后将这两个数组加到要创建的字典当中:
NSArray *keys = @[@"name",@"address"];
NSArray *objects = @{@"jack",@"peking"};
NSDictionary *dic = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
示例8:
#import <Foundation/Foundation.h>
int main()
{
NSDictionary *dic = @{@"name":@"jack",@"address":@"peking"};
id obj = dic[@"name"];
NSLog(@"%@", obj);
return 0;
}
示例8展示了如何用键取值,运行结果是:jack
字典也有可变的字典,它是不可变字典的一个子类。
示例9:
#import <Foundation/Foundation.h>
int main()
{
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjects:@[@"zhangsan",@"lisi",@"wangwu"] forKeys:@[@"1",@"2",@"3"]];
[dic setObject:@"maliu" forKey:@"4"];//添加键值对
[dic removeObjectForKey:@"3"];//移除键值对
NSLog(@"%@", dic);//输出这个可变字典
return 0;
}
示例9展示了在可变字典中添加键值对和移除键值对的方法,运行结果是:
{
1 = zhangsan;
2 = lisi;
4 = maliu;
}
字典是怎么遍历的呢?其实它和对象数组的遍历方法类似,我们通常使用代码块来遍历字典。
示例10:
#import <Foundation/Foundation.h>
int main()
{
NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjects:@[@"zhangsan",@"lisi",@"wangwu"] forKeys:@[@"1",@"2",@"3"]];
[dic enumerateKeysAndObjectsUsingBlock:
^(id key, id obj, BOOL *stop) {
NSLog(@"%@ - %@", key, obj);
}];
return 0;
}
示例10展示了如何利用代码块遍历字典,运行结果是:
1 - zhangsan
2 - lisi
3 - wangwu
基本数据类型包装成对象
Foundation框架中有一个类:NSNumber可以将基本数据类型包装成对象。我们把将基本数据类型转化为对象称为装箱,把将对象转化为基本数据类型称为拆箱。
装箱利用NSNumber这个类的一些方法:
+ (NSNumber *)numberWithChar:(char)value;
+ (NSNumber *)numberWithInt:(int)value;
+ (NSNumber *)numberWithFloat:(float)value;
+ (NSNumber *)numberWithDouble:(double)value;
+ (NSNumber *)numberWithBool:(BOOL)value;
+ (NSNumber *)numberWithInteger:(NSInteger)value;
以上这些类方法就是用来对基本数据类型进行装箱的,我们也可以利用这种格式NSNumber *num = @23
将数据快速包装成一个对象。
将数据拆箱回基本数据类型则要用到下面这些对象方法:
- (char)charValue;
- (int)intValue;
- (float)floatValue;
- (double)doubleValue;
- (BOOL)boolValue;
这些方法来自于NSNumber的父类NSValue类。
示例11:
#import <Foundation/Foundation.h>
int main()
{
NSNumber *num = [NSNumber numberWithInt:12];
NSMutableArray *array = [NSMutableArray arrayWithObject:@"liyi"];
[array addObject:num];
NSLog(@"%@", array);
return 0;
}
示例11中我们成功将12包装成对象然后将其放入对象数组中,运行结果是:
(
liyi,
12
)
示例12:
#import <Foundation/Foundation.h>
int main()
{
NSNumber *num = [NSNumber numberWithInt:12];
NSMutableArray *array = [NSMutableArray arrayWithObject:num];
NSLog(@"%@", array);
int a = [num intValue];
NSLog(@"%d", a);
return 0;
}
示例12先将12包装成了一个对象添加到对象数组中,然后将其拆箱还原成整型数据,运行结果是:
(
12
)
12
日期
Foundation框架中有一个类NSDate专门用来对日期进行操作。
示例13:
#import <Foundation/Foundation.h>
int main()
{
NSDate *date = [NSDate date];
NSLog(@"%@",date);
return 0;
}
示例13利用NSDate类获得了当前的日期,运行结果是:
2015-07-20 11:38:29 +0000
我们看日期输出有一定的格式,那么可不可以按照自己想要的格式输出日期呢?下面就是改变日期输出格式的方法。
示例13:
#import <Foundation/Foundation.h>
int main()
{
NSDate *date = [NSDate date];//获得当前的时间
NSLog(@"%@",date);//将当前时间输出
NSDateFormatter *formater = [[NSDateFormatter alloc] init];//创建一个日期格式化类的对象
formater.dateFormat=@"yy/MM/dd HH:mm:ss";//制定我们自己想要的日期输出格式
NSString *datestr = [formater stringFromDate:date];//将此前获得的时间进行格式化
NSLog(@"%@",datestr);//将格式化的日期输出
return 0;
}
示例13就是将日期格式化的方法,运行结果是:
2015-07-20 11:48:21 +0000
15/07/20 19:48:21
我们看到日期最终按照我们想要的格式进行了输出。