黑马程序员--Objective-C语言基础知识--Foundation框架的常见用法

——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
我们看到日期最终按照我们想要的格式进行了输出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值