黑马程序员-IOS-OC基础-Foundation框架的简单使用

--------------------------------------  android培训 java培训 ios培训期待与您交流! ---------------------------------

Foundation框架是其他所有ios框架的基础,Foundation框架包含了很多开发中常用的数据类型:结构体、枚举、类。Foundation框架是乔布斯在NextStep公司的时候开发的。所以,基于Foundation框架的数据类型大部分都以NS开头如:NSString,NSLog等等。
1,Foundation框架中常用的结构体
<1>NSRange:表示一个范围,在UI开发中经常用到。
void Range()
{
    /*NSRange:表示一个范围,内部结构是结构体:意思就是从location起有多少length的范围。
     typedef struct _NSRange {
        NSUInteger location;代表位置
        NSUInteger length;  代表长度
     } NSRange;
    */
    //定义一个范围
//    NSRange r1 = {2,4};//不用
//    NSRange r2 = {.location = 2, .length = 4};//不用
//    NSRange r3 = NSMakeRange(5, 6); //常用必须掌握
    
    //定义一个OC字符串str
    NSString *str = @"I love china";
    //查找love在字符串str中的范围,如果找不到,length=0,location=NSNotFound==-1
    NSRange r4 = [str rangeOfString:@"love"];
    //这里用%ld是因为location、length的返回值是NSUInteger,其实内部是unsigned long。
    NSLog(@"location = %ld,length = %ld",r4.location,r4.length);
    
    //运行结果:2014-04-13 13:54:49.050 Foundation框架-结构体[433:303] location = 2,length = 4
}
<2>Foundation中对坐标点、UI尺寸、矩形块的使用
void point()
{   /*NSPoint或者CGPoint:代表一个坐标点
     NSSize或者CGSize:代表一个UI元素的尺寸(包含宽width和高width)
     NSRect或者CGRect:代表一个矩形块(由点和尺寸组成)
     */
    //定义一个点的方式:
    CGPoint p1 = NSMakePoint(10, 20);
    CGPoint p2 = CGPointMake(10, 20);
    
    NSPoint p3 = CGPointMake(20, 30);//开发中最常用的
    NSPoint p4 = NSMakePoint(20, 30);
    
    //表示原点,
    //CGPointZero 相当于 CGPointMake(0, 0);
    
    //定义一个UI元素尺寸的方式
    NSSize s1 = NSMakeSize(100, 50);
    CGSize s2 = CGSizeMake(100, 50);
    NSSize s3 = CGSizeMake(150, 50);
    CGSize s4 = NSMakeSize(150, 50);
    
    //定义一个矩形块的方式(由点和尺寸组成)
    NSRect r1 = NSMakeRect(10, 20, 100, 50);
    CGRect r2 = CGRectMake(0, 0, 100, 50);
    
    CGRect r3 = {{10,20},{100,50}};
    CGRect r4 = {p1,s1};
    
    //定义一个范围
     NSRange rang = NSMakeRange(2, 3);
    //将结构体转为字符串
    NSString *str1 = NSStringFromPoint(p1);
    NSString *str2 = NSStringFromSize(s1);
    NSString *str3 = NSStringFromRect(r1);
    NSString *str4 = NSStringFromRange(rang);
    
    NSLog(@"%@<-->%@<-->%@<-->%@",str1,str2,str3,str4);
    //运行结果是:
    //2014-04-13 15:06:36.950 Foundation框架-结构体[519:303] {10, 20}<-->{100, 50}<-->{{10, 20}, {100, 50}}<-->{2, 3}
    
    //比较两个点是否相同
    BOOL b1 = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));
    //比较两个矩形块是否相同
    //CGRectEqualToRect(<#CGRect rect1#>, <#CGRect rect2#>);
    //比较两个UI元素的尺寸是否相同
    //CGSizeEqualToSize(<#CGSize size1#>, <#CGSize size2#>);
    
    // 判断一个点是否在一个矩形块内
    BOOL b2 = CGRectContainsPoint(CGRectMake(50, 40, 100, 50), CGPointMake(60, 45));//
    
    NSLog(@"%d---%d",b1,b2);//运行结果:2014-04-13 15:20:24.416 Foundation框架-结构体[588:303] 1---1

    //使用CGPointZero、CGRectEqualToRect、CGRectContainsPoint等的前提是要添加CoreGraphics框架
}
2,Foundation框架中常用的类
<1>字符串(NSString)
(1)NSString:不可变字符串
/*
    //1,字符串的创建
    NSString *str1 = @"I like itheima";
    
    //NSString *str2 = [[NSString alloc] initWithString:@"itheima"];不用的
    
    NSString *str3 = [[NSString alloc] initWithFormat:@"age is %d",20];//字符串拼接返回新的字符串
    //C字符串转换成OC字符串
    NSString *str4 = [[NSString alloc] initWithUTF8String:"itheima"];
    
    //OC字符串转换成C语言字符串
    const char *c = [@"beijing" UTF8String];
    const char *c1 = [str1 UTF8String];
    
   // NSLog(@"%@",str4);
    //printf("%s  %s\n",c,c1);
    
    //2,从文件读取字符串
    //NSUTF8StringEncoding 用到中文就要用这种编码
    NSString *str5 = [[NSString alloc] initWithContentsOfFile:@"/Users/wzh/Desktop/123.txt" encoding:NSUTF8StringEncoding error:nil];
    
    //3,从URL读取字符串
    //URL:资源路径
    //协议头:路径
    NSURL *url = [[NSURL alloc] initWithString:@"http://www.itheima.com"];
    */
    //NSURL *url1 = [[NSURL alloc] initWithString:@"file:///Users/wzh/Desktop/123.txt"];
    NSURL *url1 = [NSURL fileURLWithPath:@"/Users/wzh/Desktop/123.txt"];
    
    NSString *str6 = [[NSString alloc] initWithContentsOfURL: url1 encoding:NSUTF8StringEncoding error:nil];
    
    NSLog(@"\n%@",str6);
    
    //一般都会有一个类方法跟对象方法对应,开发中一般都使用类方法,效率比较高
//    [NSURL URLWithString:@"http://www.itheima.com"];
//    [NSString stringWithContentsOfFile:url encoding:NSUTF8StringEncoding error:nil];
//    [NSString stringWithFormat:@"age is %d",25];
    
    
    //4,字符串的导出(把字符串写进文件中)
    [str6 writeToFile:@"/Users/wzh/Desktop/My.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
    [@"I \nlike \nitheima" writeToFile:@"/Users/wzh/Desktop/My.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
    NSURL *url2 = [NSURL fileURLWithPath:@"/Users/wzh/Desktop/abc.txt"];
    
    [@"I \nlike \nitheima" writeToURL:url2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
(2)NSMutableString:可变字符串
//创建可变字符串
    NSMutableString *s1 = [NSMutableString stringWithFormat:@"i like china"];
    
    NSMutableString *s2 = [NSMutableString stringWithString:@" itheima"];
    
    //拼接s2到s1的后面
    [s1 appendString:s2];
    
    //获取like在s1中的范围,并且删除like
    NSRange ragne = [s1 rangeOfString:@"like"];
    [s1 deleteCharactersInRange:ragne];
    
    //创建不可变字符串
    NSString *s3 = [NSString stringWithFormat:@"name is %@",@"jim"];
    
    //拼接内容到s3的后面并且返回一个新的字符串s4
    NSString *s4 = [s3 stringByAppendingString:@"123"];
    
    NSLog(@"%@\n%@\n%@\n%@",s1,s2,s3,s4);

(3)NSString和NSMutableString的区别:
1,创建方式都差不多的;
2,在拼接字符串的时候,NSString返回的时一个新的字符串,而NSMutableString返回的是原来的字符串加拼接上的字符串。
3,两者的删除子串的方式不一样:NSMutableString是先获取要删除子串在母串中的范围,再根据范围去删除对应的子串,并且返回删除子串后的母串。NSString删除字符串的方式是先把不可变的字符串转换成可变字符串,然后再利用可变字符串的删除方式删除子串。
//不可变字符串删除子串的方法:将NSString转换成NSMutableString,然后再删除子串。
    //定义不可变字符串
    NSString *s = @"I like beijing";
    //将不可变字符串转换成可变字符串
    NSMutableString *s2 = [NSMutableString stringWithString:s];
    
    //找到like在s2中的范围,并且删除like
    NSRange r = [s2 rangeOfString:@"like"];
    [s2 deleteCharactersInRange:r];
    
    NSLog(@"%@",s2);//结果为:I  beijing
3,Foundation框架中常用的集合类
<1>Array:
NSArray:不可变数组
void array()
{
    //OC数组不能存放nil值
    //OC数组只能存放OC对象,不能存放非OC对象类型,比如int、struct、enum等
    
    NSArray *arr1 = [NSArray array];//这个数组arr1永远是空数组
    
    //1,OC数组的创建
    NSArray *arr2 = [NSArray arrayWithObject:@"jim"];//只能存放一个元素
    //可以存放多个元素,nil是数组元素结束的标志
    NSArray *arr3 = [NSArray arrayWithObjects:@"jack",@"rose",@"jake",@"jiesn",  nil];
    //快速创建数组(编译器的新特性)
    NSArray *arr4 = @[@"jack",@"rose"];//这个比较常用
    
    //2,获取NSArray的元素个数
    NSLog(@"%ld---%ld",arr2.count,arr3.count);
    
    //3,访问OC数组中的元素
    NSLog(@"%@",[arr3 objectAtIndex:1]);
    //编译器的新特性
    NSLog(@"%@", arr3[1]);//这个比较常用
    
    //4,数组元素的遍历
    Person *p = [[Person alloc] init];//创建Person对象
    NSArray *arr5 = @[p,@"beijing",@"shanghai",@"taiwan"];//创建数组
    
    //一般遍历
    for (int i = 0; i < arr5.count; i++) {
        NSLog(@"%@",arr5[i]);
    }

    //快速遍历:   id obj:代表着数组中的每一个元素
    for (id obj in arr5)//缺点是不知道遍历的是第几次,但是可以通过定义变量实现
    {
        //找出obj元素在数组中的位置
        NSUInteger i = [arr5 indexOfObject:obj];
        NSLog(@"%ld - %@",i,obj);
    }

    //利用block遍历数组元素:每遍历到一个元素,就会调用一次Block,并且把当前元素和元素的索引位置当做参数传给block
    [arr5 enumerateObjectsUsingBlock:
     ^(id obj, NSUInteger idx, BOOL *stop)
    {
        NSLog(@"%ld - %@",idx,obj);
    }];
    
    
}
NSMutableArray:可变数组
void MutableArray()
{
    //1,创建可变数组
    NSMutableArray *marr = [NSMutableArray arrayWithObjects:@"shanghai",@"taiwan",nil];

    //NSMutableArray *arr = @[@"beijing",@"shanghai"];错误写法 @[]只能创建不可变数组NSArray
    
    //2,添加元素
    [marr addObject:[[Person alloc] init]];
    [marr addObject:@"beijing"];
    //[marr addObject:nil];这个是错误写法
    
    //3,删除指定对象元素
    [marr removeObject:@"beijing"];
    [marr removeObjectAtIndex:2];//删除指定位置的元素
    //4,删除所有元素
    //[marr removeAllObjects];
    
    NSLog(@"%ld",marr.count);
    
    //遍历数组元素
    for (id obj in marr) {
        NSLog(@"%@",obj);
    }
    //打印整个数组
    NSLog(@"%@",marr);

}
NSArray和NSMutableArray的区别:
(1)创建方式:NSMuableArray不能用@[ ];快速创建。
(2)NSArray不能添加元素,也不能删除指定元素,不能对元素进行增删改查。
(3)遍历元素的方式一样。
<2>Set集合:
不可变Set集合
oid set()
{
    //空set
    NSSet *s = [NSSet set];
    //创建set集合
    NSSet *s1 = [NSSet setWithObjects:@"jim",@"beijing",@"shanghai",@"jack",nil];
    
    NSString *str = [s1 anyObject];//随机拿出一个元素
  
    //打印set的元素个数
    NSLog(@"%ld",s1.count);
    
    //打印出随机拿出的元素
    NSLog(@"%@",str);
    
    //打印集合
    NSLog(@"%@",s1);

}
NSMutableSet:可变集合
void MutableSet()
{
    //创建MutableSet
    //NSMutableSet *s1 = [NSMutableSet set];//创建空的可变Set集合
    NSMutableSet *s = [NSMutableSet setWithObjects:@"haha",@"sichuan", nil];//创建有元素的可变Set集合
    
    //添加元素
    [s addObject:@"hainan"];
    
    //删除指定元素
    [s removeObject:@"haha"];
    //打印集合
    NSLog(@"%@",s);
}
<3>NSSet NSArray 的对比:
#1,共同点:
(1)都是集合,都能存放多个OC对象;
(2)都是只能存放OC对象,不能存放非OC对象,比如,基本数据类型:int、char、float等,结构体,枚举。
(3)本身都不可变,都有一个可变的子类。
#2,不同点:NSArray的元素是有顺序的,NSSet的元素是没有顺序的。
<4>字典NSDictionary
NSDictionary:不可变字典
void dictionary()
{
    /*不可变字典
     NSDictionary:字典
     key------value
     索引------文字内容
    */
    
    //字典的创建1
    NSDictionary *d = [NSDictionary dictionaryWithObject:@"jim" forKey:@"name"];
    
    //字典的创建2
    NSArray *key = @[@"name",@"address"];
    NSArray *value = @[@"jim",@"北京"];
    NSDictionary *d1 = [NSDictionary dictionaryWithObjects:value forKeys:key];
    
    //字典的创建3
    NSDictionary *d2 = [NSDictionary dictionaryWithObjectsAndKeys:@"jack",@"name",@"shanghai",@"address", nil];
    
    //字典的创建4(快速创建)
    NSDictionary *d3 = @{@"name": @"jim",@"address" : @"beijing"};
    
    //值的取出方式1
    id obj = [d3 objectForKey:@"name"];
    
    //值的取出方式2(编译器新特性)
    id obj2 = d3[@"name"];
    
    //打印出字典中的值
    NSLog(@"%@ - %@ ",obj,obj2);
    
    //打印字典
    //NSLog(@"%@",d2);
    //打印出字典里面的键值对个数
    NSLog(@"%ld",d3.count);
}
NSMutableDictionary:可变字典
void MutableDictionary()
{
    //可变字典
    //创建一个空的可变字典
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    
    //添加键值对
    [dict setObject:@"jim" forKey:@"name"];
    [dict setObject:@"beijing" forKey:@"address"];
    
    //会把前面的值覆盖掉
    [dict setObject:@"jack" forKey:@"name"];
    
    //取出key对应的值
    NSString *str = dict[@"name"];
    
    //打印字典中的值
    NSLog(@"%@",str);
    
    //移除键值对
    [dict removeObjectForKey:@"name"];
    
    //打印字典
    NSLog(@"%@",dict);
    
    //错误写法:不能这样写:前面是可变字典,后面的是不可变字典,会报经典错误!!
    //NSMutableArray d2 = @{@"name": @"rose"};
    //[d2 setObject:@"jim" forKey:@"name"];
   
}
字典的遍历(NSDictionary和NSMutableDictionary都可以使用)
    //字典不允许有相同的key,但允许有相同的value;字典是无序的
    NSDictionary *dict = @{
                           @"name1": @"小明",
                           @"name2": @"小明",
                           @"name3": @"小明",
                           @"qq":@"9827792",
                           @"address":@"北京",
                           @"address2":@"上海"};
    //字典的遍历(用for循环遍历)
    NSArray *keys = [dict allKeys];//先获取所以的key
    
    for (int i = 0; i< dict.count; i++)
    {
        NSString *key = keys[i];//遍历所有的key
        NSString *obj = dict[key];//再用key获取对应的value值
        
        NSLog(@"%@ = %@",key,obj);
    }
    NSLog(@"-------------------");
    //利用block遍历字典,很好用
   [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@ = %@",key,obj);
    
        //*stop = YES;遍历一次就停止
    }];
Foundation框架中集合类小结:
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    /*集合总结
     1,NSArray\NSMutableArray
        *1,元素有序
        *2,快速创建(不可变):@[obj1, obj2, obj3]
        *3,快速访问元素:数组名[元素的位置]
     
     2,NSSet\NSMutableSet
        *1,元素无序
     
     3,NSDictionary\NSMutableDictionary
        *1,元素无序
        *2,快速创建(不可变):@{key1 : value1, key2 : value2}
        *3,速访问元素(值):字典名[key]
     */
    
    //比较复杂的写法
    NSArray *person = @[
    @{@"name": @"jim",@"qq" : @"893899",@"books" : @[@"java宝典",@"ios宝典"]},
    @{@"name": @"jack",@"qq" : @"10099922"},
    @{@"name": @"小明",@"qq" : @"886698696"},
    @{@"name": @"奥巴马",@"qq" : @"8498379427"},
    ];
    //取出数组中的字典
    NSDictionary *jack = person[1];
    
    //取出@"ios宝典"
    NSString *s = person[0][@"books"][1];
    
    //取出books对应的value值--@"java宝典",@"ios宝典"
    NSArray *arry = person[0][@"books"];
    
    NSLog(@"%@",jack);
    //取出数组中字典的值:先取出3位置对应的字典,再取出字典中name这个key对应的数据
    NSLog(@"%@",person[3][@"name"]);
    
    NSLog(@"%@",arry);
    
    NSLog(@"%@",s);
    return 0;
}
4,Foundation框架中包装类
NSNumber:可以把基本数据类型包装成OC对象。继承自NSValue
void NSnumber()
{
    
    //NSNumber:可以把基本数据类型包装成OC对象,
    
    //把double类型的数据包装成NSNumber对象
    @20.5;
    //把字符包装成NSNumber对象,注意同@"A"的区别 @"A":是NSString对象
    @'A';
    //把BOOL类型的数据包装成NSNumber对象
    @YES;
    
    //也可以把字符串转换成基本数据类型
    int i = 15;
    NSString *str = [NSString stringWithFormat:@"%d", i];
   // NSString *str =@"15";
    NSLog(@"%d", [str intValue]);
    
    
    //将变量包装成NSNumber对象
    int age = 10;
    //@(age);这里的()是必须加的,代表着取值
    NSNumber *num = [NSNumber numberWithInt:age];//也可以用@(age)代替。

    //将20包装成NSNumber对象
    //NSNumber *num = [NSNumber numberWithInt:20];
    NSNumber *num1 = @20;//编译器新特性
    NSNumber *num2 = @20.5;
    
    //然后再将num对象存入字典
    NSDictionary *dict = @{@"name" : @"jim",@"age1" : num1,@"name" : @"rose",@"age2" : num2};

    //取出age对应的值
    NSNumber *n1 = dict[@"age1"];
    NSNumber *n2 = dict[@"age2"];
    
    //将NSNumber对象转换成基本数据类型int类型的数据
    int a = [n1 intValue];
    
    //将NSNumber对象转换成基本数据类型double类型的数据
    double b = [n2 doubleValue];
    
    NSLog(@"%d---%0.1f",a,b);
   // 运行结果:20---20.5
    
}
NSValue: 可以把结构体包装成 OC 对象
//NSNumber之所以能够包装基本数据类型为对象,是因为继承了NSValue
void Nsvaule()
{
    //用NSValue可以把结构体包装成OC对象
    
    CGPoint p = CGPointMake(10, 20);
    CGRect r  = CGRectMake(10, 20, 100, 50);
    //将结构体转为Value对象
    NSValue *value = [NSValue valueWithPoint:p];
    NSValue *value1 = [NSValue valueWithRect:r];
    
    //将vaule转为对应的结构体
    [value pointValue];
    [value1 rectValue];
 
}
5,Foundation框架中的NSDate类的使用
void NSdate()
{
    //创建一个时间
    NSDate *date = [NSDate date];
    //打印出的是格林威治时间(0时区)
    //NSLog(@"%@",date);
    
    NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];
    
    //从1970年开始走过的秒数
//    NSTimeInterval s =  [date2 timeIntervalSince1970];//NSTimeInterval == double
//    NSLog(@"%f",s);

    //将NSDate转换成字符串
    //日期格式化类
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    
    //y 年 M 月 d 日
    //m 分 s 秒 H (24制)时 h(12制)时
    formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";//定义格式
    
    //调用NSString的转换方法
    NSString *str = [formatter stringFromDate:date];
    
    NSLog(@"%@",str);
    
    //将字符串转成NSDate
    NSString *time = @"2008-9-10 9:30:30";
    //创建日期格式化类
    NSDateFormatter *formatter2 = [[NSDateFormatter alloc] init];
    //定义格式
    formatter2.dateFormat = @"yyyy-MM-dd HH:mm:ss";
    
    //调用NSDate的转换方法
    NSDate *d =[formatter2 dateFromString:time];
    
    NSLog(@"%@",d);//打印出的是0时区的时间
    //结果为:2008-09-10 01:30:30 +0000

}




--------------------------------------  android培训 java培训 ios培训期待与您交流! ---------------------------------




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值