黑马程序员_OC Foundation框架重要结构体和类


(一)结构体:
foundation框架中定义了很多实用的方法,类,结构体。常用的的结构体有四种,分别是NSRange,NSPoint/GPoint(跨平台),NSSize/CGSize,NSRect、CGRect。下 面依次介绍。
1. NSRange:表示范围,在OC中定义如下:

typedef struct _NSRange {

   NSUInteger location;

   NSUInteger length;

} NSRange;


可见NSRange定义了两个unsigned long类型的正整数。一个是location位置,一个是length长度。作用于字符串,数组中用于计算某个,或者某段字符串(数组)的位置和长度。

用法实现:

NSRange range =NSMakeRange(0,3);


// 查找字符串范围:

    NSString *str =@"heh ala yeah";

    NSRange range1 = [strrangeOfString:@"yeah"];

    NSLog(@"location = %ld,length = %ld",range1.location,range1.length);

    NSRange range2 = [strrangeOfString:@"nihao"];

    NSLog(@"location = %ld,length = %ld",range2.location,range2.length);

    NSLog(@"%d",NSNotFound);

    NSLog(@"%ld",NSNotFound);

结果:
2015-04-07 21:04:25.492 结构体[3435:623012] location = 8,length = 4
2015-04-07 21:04:25.493 结构体[3435:623012] location = 9223372036854775807,length = 0
2015-04-07 21:04:25.493 结构体[3435:623012] -1
2015-04-07 21:04:25.494 结构体[3435:623012] 9223372036854775807

如上代码所示,首先是一个NSRange的定义函数,NSMakeRange(int,int)用来描述NSRange结构体内容。下面用
到了一个NSString系统自定义的对象方法,用来计算字 符串中的范围[str rangeOfString :NSString *],方法返回一个
NSRange类型的结构体,当传入的要查找的字符没有时,length会默认是0,location会变成 9223372036854775807,
这是一个unsigned long类型,如果已%d int类型输出,这个值等于-1,在OC中这个值还可以用NSNotFound来表示。
2.NSPoint定义:

    struct CGPoint {

        CGFloat x;

        CGFloat y;

    };

NSPoint里面有两个参数,其实就是double x和y。用来表示坐标。

用法实现:

    NSPoint p1 =NSMakePoint(10,10);

   CGPoint p2 = CGPointMake(10,10);

   NSPoint P3 = CGPointMake(10,10);

   CGPoint P4 = NSMakePoint(10,10);

    


3.NSSize定义:

    struct CGSize {

        CGFloat width;

        CGFloat height;

    };

NSSize有两个参数,分别是double类型的宽和高。
用法实现:

    NSSize p5 =NSMakeSize(10,10);

   CGSize p6 = CGSizeMake(10,10);


4.CGRect定义:

    struct CGRect {

        CGPoint origin;

        CGSize size;

    };

  CGRect myRect(CGFloat x,CGFloat y,CGFloat width,CGFloat height)

            {

                CGRect rect;

                rect.origin.x = x;

                rent.origin.y = y;

                rent.size.width = winth;

                rent.size.height = hetigt;

               return rect;

            }


用法实现:

   CGRect p7 =CGRectMake(10,10,100,100);

   NSMakeRect(10,10,100,100);


5.结构体转化成字符:
// 结构体转化为字符串:
NSString *s1 = NSStringFromPoint(p1);
NSString *s2 = NSStringFromSize(p5);
NSString *s3 = NSStringFromRect(p7);
NSLog(@"p1 = %@  p5 = %@  p7 = %@",s1,s2,s3);

输出结果:
p1 = {10, 10} p5 = {10, 10} p7 = {{10, 10}, {100, 100}}

6.原点:

CGPointZero ==CGPointMake(0,0)

同样的,还是有CGSizeZero和CGRectZero。CGRange没有Zero属性。


7.比较两个结构体是否相同:

   bool a =CGPointEqualToPoint(CGPointMake(10,10),NSMakePoint(10,10));

   bool b = CGSizeEqualToSize(CGSizeMake(100,100),CGSizeMake(10,10));

   CGRect c1 = CGRectMake(10,10,10,10);

   CGRect c2 = CGRectMake(10,10,10,10);

   bool c = CGRectEqualToRect(c1, c2);

   bool d =CGRectEqualToRect(CGRectMake(10,10,10,10),CGRectMake(10,10,10,10));

如上分别是比较两个点坐标,两个长宽尺寸和两个rect位置尺寸是否相同。可见函数名称和用法都是类似的。
8.由NSRect定义我们可以看出这个结构体其实定义出了一块矩形,那么下面这个函数用来判断一个点在不在这个矩形内部。

bool e =CGRectContainsPoint(CGRectMake(10,10,10,10),CGPointMake(15,15));    

   NSLog(@"%d",e);



(二)Foundation中常用的类:

Foundation框架中常用到的类有NSObject,NSDate,NSString,NSMUtableString,NSArray,NSMUtableArray,NSSet,NSMUtableSet,NSDictionary,NSMUtableDictionary。

其中有MUtable的分别是其相应的子类。


1.NSString::可变字符串
字符串创建:字符串创建有很多方式,原因是系统NSString这个类中有很多早已写好的构造方法。NSString是不可变字符串,意味着字符串定义好后不可以再添加和删除。
下面是几种基本的创建方式:
NSString *str1 = [[NSStringalloc]init];
str1 =@"dsa";
NSString *str2 =@"dsa";
NSString *str3 = [[NSStringalloc]initWithFormat:@"dsa is %@",@"shy"];
NSLog(@"%@",str3);

2.oc字符串和c字符串的相互转化:

    // c-->oc

    NSString *str4 = [[NSStringalloc]initWithUTF8String:"黑马"];

    // oc-->c

    [str4UTF8String];


3.传入一个文本文件,可以传入一个file或者一个url。file是本地文件,路径采用绝对路径。url是资源路径的意思,理论上url范围比文本要广泛,并且什么都可以传入。url构成由协议头://路径 组成。路径同样采用绝对路径。协议头因资源分类不同而不同。可以是http://的网络资源,可以是file://的本地文件资源,可以是ftp://服务器资源。他们都是调用init构造方法来传入,下面是代码组成:

传入file:

   NSString *s1 = [[NSStringalloc]initWithContentsOfFile:@"/Users/aixiaoxin/Desktop/1.txt"encoding:NSUTF8StringEncodingerror:nil];

    NSLog(@"\n%@",s1);


传入url:
NSURL *url = [[NSURLalloc]initWithString:@"file:///Users/aixiaoxin/Desktop/1.txt"];
NSString *s2 = [[NSStringalloc]initWithContentsOfURL:urlencoding:NSUTF8StringEncodingerror:nil];
NSLog(@"%@",s2);

如上,字符串对象构造方法要求先传入一个NSURL类型的OC对象,所以先创建OC对象初始化时候把文件的绝对路径传入。第二个填写的参数是与编码有关的,我们只需知道输入NSUTF8StringEncoding就可以输入中文就行。error目前全部填写nil空。此时就完成了用两种方法传入了一个文本给字符串的功能。

注:NSURL是万能的,什么都可以读取,只要有路径,不是文本资源都可以读取。百度网页也可以抓取出来。但是网页的编码不同,有时候抓取会失败。 

NSURL的另一个方法:直接说明是file文件:

[NSURLURLWithString:@"file:///Users/aixiaoxin/Desktop/1.txt"];
[NSURLfileURLWithPath:@"/Users/aixiaoxin/Desktop/1.txt"];

④面向对象的思想:

一般来说,OC系统自定义的对象方法一般都会有一个类方法与之相对应。并且方法开头都是以类名开头。代码如下:
[NSStringstringWithFormat:@"haha"];
[NSStringstringWithUTF8String:"haha"];
[NSStringstringWithContentsOfFile:@"/Users/aixiaoxin/Desktop/1.txt"usedEncoding:NSUTF8StringEncodingerror:nil];
[NSURL URLWithString:@"file:///Users/aixiaoxin/Desktop/1.txt”];
注:不知道为什么导入一个file的类方法会提示内存错误。bad_cess。

⑤写入一个字符串:

[@"shyshy\nshy" writeToFile:@"/Users/aixiaoxin/Desktop/2.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSString *s1 =@"heima\nheima\nheima";
NSURL *url = [NSURLfileURLWithPath:@"file:///Users/aixiaoxin/Desktop/3.txt"];
[s1 writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];

2.NSMUtableString:可变字符串。内容可以随意添加和删除。这时候需要用到拼接方法和删除方法。

添加:

    NSMutableString *s1 = [NSMutableStringstringWithFormat:@"hei ma hei ma"];

    [s1 appendFormat:@"10 21 21"];

    [s1 appendString:@"ccccc"];

    NSLog(@"%@",s1);


删除:

    NSRange range = [s1rangeOfString:@"ma"];

    [s1 deleteCharactersInRange:range];

    NSLog(@"%@",s1);


3.集合类:NSArray,NSSet,NSDictionary和其相应的子类统称为集合类,集合类就是可以装很多东西的类。就像C语言中的数组那样。

NSArray:OC中的数组。区别于C语言数组,C语言数组是面向过程的,并且数组的类型都一样。NSArray是面向对象的数组,里面什么OC对象都可以放。但是不能存放基本数据类型和nil。(不能存放非OC类型)

NSArray 是不可变数组。数组创建是多少个就是多少个。初始创建是空数组那么就永远是空数组。

NSArray数组类创建:
NSArray *array = [NSArrayarray];
NSArray *array1 = [NSArrayarrayWithObjects:@"hei ma",[[Personalloc]init],nil];
[NSArrayarrayWithObject:@"cheng xu yuan"];

获取数组的长度(一个get方法,所以可以用点语法)
[array1count];
NSLog(@"%ld",array1.count);


获取某个位置的数组内容:

NSLog(@"%@",[array1objectAtIndex:0]); // 这个效率太低
array1[0];
NSLog(@"%@",array1[0]); // 目前都用这个

// 遍历这个数组的三种方式:

    NSArray *array =@[@"hei ma",@"xunlian",@"23123"];

   //遍历这个数组的三种方式:

    // 1.正常循环遍历:

   for (int i =0;i<array.count;i++)

    {

       NSLog(@"%@",array[i]);

       if (i ==1)

        {

           break;

        }

        

    }

    // 2.快速遍历:

    

   int a = 0;

    for(id objin array) // 表示遍历array这个数组的id类型oc对象

    {

       NSUInteger a = [arrayindexOfObject:obj];//找出obj元素在数组中的位置

       NSLog(@"%ld    %@",a,obj);

    }

    // 3.block参数遍历:

    [arrayenumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop) {

       NSLog(@"%ld  %@",idx,obj);

       if (idx ==1)

        {

            *stop =YES;

        }

    }];


方法3既能拿到元素也能拿到索引。遍历都可以选择到什么时候停止遍历,原理都是一个if语句。


4. 计算单个文件中的行数:


    int lineCount(NSString *location)

    {

       NSString *p = [NSStringstringWithContentsOfFile:locationencoding:NSUTF8StringEncodingerror:nil];

    

       NSArray *a = [pcomponentsSeparatedByString:@"\n"];

    

       int i =0;

       for (NSString *strin a)

       {

          NSLog(@"%d %@",i,str);

           i++;

        

       }

       return a.count;

    

   }

    int main()

   {

       int count =lineCount(@"/Users/aixiaoxin/Desktop/2.txt");

       NSLog(@"%d",count);

    

       return0;

    }



5.NSMUtableArray:可变数组,可以添加或者删除数组元素。

基本创建和添加删除

    NSMutableArray *array = [NSMutableArrayarrayWithObjects:@"jom",@"dasdasdas",nil];

    [array addObject:@"jack"];

    [array removeObject:@"jom"];

    [array removeObjectAtIndex:1];

    NSLog(@"%@",array);


NSSet:也可以存放很多对象。NSSet和NSArray最大的区别是NSSet是没有顺序的。NSSet不可变,NSMUtableSet是可变的,可以随时添加对象,但是是没有顺序的。

6.NSSet基本使用:
NSSet *set = [NSSetset];
NSSet *set1 = [NSSetsetWithObjects:@"da",@"hei",@"ma",@"xunlian",nil];
NSString *str = [set1anyObject];
NSLog(@"%@",str);

set1 anyObject方法是随机抽取一个元素,因为NSSet没有顺序。
NSMutableSet *set2 = [NSMutableSetsetWithObjects:@"dads",@"ddddd",@"1111",nil];
[set2addObject:@"ghhhhh"];
[set2removeObject:@"1111"];

总结:NSSet和NSArray都是集合,都能存放多个OC对象,并且只能存放OC对象,不能存放非OC对象。都有一个可变的子类Mutable,本身都是不可变的。但是NSArray是有顺序的,NSSet是无序的。



7.NSDictionary:
字典里面存放的都是键值对。一个索引对应一个内容。一个key对应一个value。
基本使用:

NSDictionary *dict = [NSDictionary dictionaryWithObject:@"aixin" forKey:@"name"];

NSDictionary *dict2 = @{@"name" :@"aixin",@"address" :@"China"};

id obj = dict2[@"name"];

NSLog(@"%@",obj);

NSDictionary *dict = [NSDictionarydictionaryWithObject:@"aixin"forKey:@"name"];
NSDictionary *dict2 =@{@"name" :@"aixin",@"address" :@"China"};
id obj = dict2[@"name"];
NSLog(@"%@",obj);

字典对象的.count方法返回的是键值对的个数。

8.NSMutabeDictionary:和上面的mutable一样,是可变的字典。哪怕初始创建是空字典也可以新添加键值对。
基本使用:

    NSMutableDictionary *dict = [NSMutableDictionarydictionary];

    [dict setObject:@"shy"forKey:@"name"];

    [dict setObject:@"china"forKey:@"address"];

    [dict removeObjectForKey:@"name"];

    NSLog(@"%@",dict);

    NSString *str = dict[@"name"];

    注:数组打印是一个(),里面是数组内容,字典打印是一个{},里面一个key对应一个value。

    

字典遍历:字典遍历就是拿出整个字典所有的key和一一对应的value值。可是字典也是无序的,只有array才有序。字典遍历也用到一个关乎block的类方法,并且遍历方法开头基本都是enmuer。

    NSDictionary *dict1 =@{@"name" :@"aixin",

                           @"address" :@"beijing",

                           @"birthday" :@"07-02",

                           @"home" :@"海淀",

                           @"cash" :@"100"};

    [dict1enumerateKeysAndObjectsUsingBlock:^(id key,id obj,BOOL *stop) {

    

       NSLog(@"%@--%@",key,obj);

    }];

    输出结果:

    2015-04-08 11:33:28.793 dici[5192:988323] home--海淀

    2015-04-08 11:33:28.793 dici[5192:988323] cash--100

    2015-04-08 11:33:28.793 dici[5192:988323] name--aixin

    2015-04-08 11:33:28.793 dici[5192:988323] birthday--07-02

    2015-04-08 11:33:28.793 dici[5192:988323] address--beijing

    可见排序是无序的,并且遍历最佳方法是调用遍历方法。

    集合总结:

    1.NSArray\NSMutableArray

    有序

         快速创建(不可变):@[obj1, obj2, obj3]

         快速访问元素:数组名[i]

         2.NSSet\NSMutableSet

         无序

         3.NSDictionary\NSMutableDictionary

         无序

         快速创建(不可变):@{key1 : value1,  key2 : value2}

         快速访问元素:字典名[key]

    所有快速创建都是不可变的。

    这些集合类只可以存放OC对象,不可以存放非OC对象。想要存放非OC对象,就要快速把它转成对象。将各种数据类型转化类OC对象用到关键字NSNumber。

    

     int a = 100;

      @(a);

      char b ='c';

      @(b);

      @10.76;

      NSArray *array =@[

                   @{@"name" :@"nack",@"age" :@"@(a)"},

                   @{@"name" :@"oom",@"age" :@"@(b)"},

                   @{@"name" :@"zo",@"age" :@"@10.56"},

                   @{@"name" :@"ka",@"age" :@"@15"}

                        ];

其实NSNumber能包装基本类型,完全是因为继承自NSValue。NSNumber只能更改数字数据类型为Number对象,NSValue功能要比NSNumber强大,它可以更改枚举,结构体数据类型为Value类型的OC对象。之前我们学到过NSRect,NSPoint,NSRange,NSSize等常用结构体,这些结构体都可以变成OC对象,同时改变后的OC对

象也可以调用方法变回结构体:

    ①结构体转为value: 

    NSPoint p =CGPointMake(10,10);

   NSValue *value = [NSValuevalueWithPoint:p];


    ②value转为结构体:

    NSValue *value = [NSValuevalueWithPoint:p];

   NSPoint p1 = [valuepointValue];


    这样转化为value的结构体就可以甚至放到数组里面了。


    9.NSDate:

    之前我们一直用结构体表示时间。现在可以利用对象来表示时间。对象可以增加方法,这样会更方便。

    NSDate *date = [NSDatedate];

    // date100秒后的date1

    NSDate *date1 =[NSDatedateWithTimeInterval:100sinceDate:date];

    日期格式化:

    想要把一个date对象显示在手机上,只能先转化成字符串。此时要先设置格式,要接触到日期格式化类。

    NSDate *date = [NSDatedate];

    NSDateFormatter *fomatter = [[NSDateFormatteralloc]init];

    fomatter.dateFormat =@"yyyy--MM--dd--HH--mm--ss";

    NSString *str = [fomatterstringFromDate:date];

    NSLog(@"%@",str);


如上,yy ==年,MM ==月,dd ==日,HH ==24制小时,hh ==12制小时,mm ==分钟,ss ==秒。此时成功将date转化成为了一定格式的字符串。

    当然,也可以把一个字符串转化成date对象。前提是也要用到日期格式化类。

    NSString *str =@"2011-1-1 18:19:21";

    NSDateFormatter *f = [[NSDateFormatteralloc]init];

    f.dateFormat =@"yyyy-MM-dd HH:mm:ss";

    NSDate *d = [fdateFromString:str];

    NSLog(@"%@",d);


至此,Fundation框架中补充的结构体,常用类已总结完毕。方法很多,但是熟悉了后其实发现是互通的。这个结构体有这个方法,那么另一个结构体只需改下名字应该也会有这个方法。每一个对象方法一般都会有与之对应的类方法。还要熟悉一些英文的意思,enumer是遍历,append是拼接,remove是珊瑚,index是索引获取位置,format是格式,并且基本类方法都会已类名开头,initWith,类型Of/with。。这些最基本的Foundation框架代码是以后最常用的代码,多多敲打便会熟悉。




    


    






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值