黑马程序员 —OC(Foundation)

                                                                        ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------     

一、  结构体的分类:

       NSRange (location  length) 

       NSPoint \ CGPoint

       NSSize \ CGSize

       NSRect \ CGRect 

  1.  NSRange是表示范围的结构体,它在Foundation中的定义:

<span style="font-size:18px;">typedef struct  _NSRange
{
        NSUInteger  location ;   代表位置
        NSUInteger  length ;     代表长度
}NSRange ; 
</span>
    声明并进行初始化一个NSRange:

   

   按照C语言中对结构体初始化化的方法:

<span style="font-size:18px;">NSRange  r1 = { 2, 4 } ;     //  不用
NSRange  r2 = {.location = 2 , .length = 4 } ;   //  不用</span>

这两种初始化方法只需了解,一般不建议使用。


    另一种初始化的方法调用:NSMakeRange函数,如下

<span style="font-size:18px;">NSRang  r3 = NSMakeRange ( 2 , 4 ) ;  //  掌握</span>

    查找某个字符串在str中的范围 

<span style="font-size:18px;">NSString  *str = @"I  love oc" ;

NSRang  range1 = [str rangeOfstring:@"love"] ;

NSLog(@"loc = %ld , length = %ld ", range1.location , range1.length ) ;
</span>
如果找不到length = 0; location = NSNotFound  ,这里的location 为一串地址码,按一般数据类型输出它的值为-1。

      例如:

     

<span style="font-size:18px;">NSRang range = [str  rangeOfstring: @"java"] ;   //  查找某个字符串在str中的范围

NSLog (@"loc =%ld , length = %ld" , range.location , range.length) ;</span>

 2. NSPoint  \ CGPoint、NSSize \ CGSize、NSRect \ CGRect

      这里的NSPoint表示的是一个点,实际上NSPoint 的定义为: 

<span style="font-size:18px;">1> typedef  CGPoint  NSPoint ;
</span>

 开发中经常用CGPoint  ,因为CGPoint是跨平台

CGPoint定义为如下:

<span style="font-size:18px;">struct CGPoint
{
     CGFloat X ;
     CGFloat Y ;
} ;
typedef  struct  CGPoint  CGPoint ;</span>
CGPoint  里面定义了表示点的两个坐标值:x 和 y。它们都是CGFloat类型的数据,CGFloat 其实就是double类型。

按照刚才初始化一个NSRange类型的数据的方式初始化一个NSPoint:

<span style="font-size:18px;">CGPoint  p1 = NSMakPoint (10 , 10 ) ;</span>

但实际上最常用的是另一种方法:

<span style="font-size:18px;">NSPoint  p2 = CGPoint ( 10 , 10 ) ;    //  最常用</span>


2> 结构体NSSize /  NSSize 

typedef   CGSize  NSSize ;

平时开发中常用CGSize , 因为CGSize 是跨平台


<span style="font-size:18px;">struct  CGSize
{
      CGFloat   width ;
      CGFloat   height ;
};
typedef  struct  CGSize  CGSize ;</span>

和它类似的方法还有:

<span style="font-size:18px;">NSSize  s1  = NSMakeSize(100, 50) ;
NSSize  s2  = CGSizeMake(100, 50) ;  //  最常用
</span>

3> 结构体NSRect / CGRect(CGPoint  CGSize)


定义

<span style="font-size:18px;">struct  CGRect 
{
         CGPoint   origin ;
         CGSize     size ;
};
typedef   struct CGRect  CGRect ;</span>


CGRect 方法

<span style="font-size:18px;">CGRect   myRect (CGFloat x, CGFloat  width, CGFloat  height)
{
          CGRect  rect ;
          rect .origin .x = x ;
          rect .origin .y = y ;
          rect .size .width = width ;
          rect .size .height = height ;
          return  rect ;
}</span>

NSRect / CGRect 常用来表示UI元素在屏幕中的区域


初始化NSRect  CGRect 的方法如下:

<span style="font-size:18px;">NSRect  r1 = CGRectMake(0,  0, 100, 50);  //  方式1
 </span><pre name="code" class="objc"><span style="font-size:18px;">CGRect  r = { CGPointZero , CGSizeMake(100 , 90)} ;
NSString  *str = NSStringFromRect(r) ; //   将结构体转为字符串打印 
NSLog(@"%@",str) ;</span>

CGRect r2 = {{0, 0} , {100, 90}} ; // 方式2 CGPoint p1 = NSMakePoint(10 , 10) ;NSSize s1 = NSMakeSize(100 , 50) ;CGRect r3 = {p1 , s1}; // 方式3

 
或者这样进行初始化: 

<span style="font-size:18px;">CGRect  r4 = { CGPointZero , CGSizeMake(100 ,90) } ;</span>
这里的CGPointZero == CGPoint (0 , 0) ;表示(0 , 0)点。

在Foundation中拥有将结构体直接转为字符串的全局方法:

<span style="font-size:18px;">NSStringFromPoint(CGPoint) ;

NSStringFromSize(CGsize) ;

NSStringFromrect(CGRect) ;

 
</span>

例如:

<span style="font-size:18px;">CGRect r = {CGPoint ,CGSize(100 , 90)};
NSString  *str = NSStringFromRect(r);  //  将结构体转为字符串打印
NSLog(@"%@", str) ;</span>


NSPoint / CGPoint 、 NSSize / CGSize 、 NSRect / CGRect  在开发中常用的函数:


注意使用CGPointZero等的前提是添加 CoreCraphics框架

比较两个点是否相同(x , y)

<span style="font-size:18px;">Bool  b = CGPointEqualToPoint( CGPointMake(10 ,10), CGPointMake(10 ,10) );</span>


判断CGRectMake范围是否包含CGPointMake 这个点
<span style="font-size:18px;">BOOL  b1 = CGRectContainsPoint(CGRectMake (0 , 0 , 100, 50), CGPointMake(2, 3)) ;
NSLog(@"%d", b1) ;</span>

二 、NSSting 类和NSMutableString 类(父类和子类的关系)

1.NSString类也就是OC中的字符串类。

创建一个NSString对象的方法:

1> 最简单的一种:

<span style="font-size:18px;">NSString  *s1 = @"jack" ;
</span>

2> 最繁琐的(一般不用):

<span style="font-size:18px;">NSString  *s2 = [[NSString  alloc]  initWithString:@"jack"] ;
</span>


3> 创建格式化的字符串:

<span style="font-size:18px;">NSString  *s3 = [[NSString  alloc]  initWithFormat:@"age is %d", 10] ;</span>

4> C语言字符串转化成OC字符串:

<span style="font-size:18px;">NSString  *s4 = [[NSString  alloc]  initWithUTF8String:"C语言字符串"] ;
</span>

5> OC字符串转成C语言字符串:
<span style="font-size:18px;">const  charchar *cs = [s4  UTF8String];</span>

其他强大的用法,从一个文件中获取字符串:

<span style="font-size:18px;">//   NSUTF8StringEncoding   用到中文就可以用这种编码
格式:
[[NSString  alloc]  initwithContentsOfFile:绝对地址 encoding:NSUTF8StringEncoding  error : nil]; 
例如:
NSString  *sS = [[NSString  alloc]  initWithContentsOfFile:@"/users/Mike/Desktop/note/目标.txt" encoding:NSUTF8StringEncoding  error:nil] ;
</span>

从一个URL中获取字符串:


URL:资源路径

协议头://路径(路径也可以是网页,例如@“www.baidu.com”)


为此我们先定义一个URL:


<span style="font-size:18px;">NSURL  *ur1 = [[NSURL  alloc]  initWithString:@"file:///Users/apple/Desktop/1.txt"] ;
NSURL  *ur1 = [[NSURL  fileURLWithpath:@"/users/apple/Desktop/1.txt"]] ;
NSString  *s6 =[[NSString  alloc]  initWithContentsOfURL:ur1 encoding:NSUTF8StringEncoding  error:nil] ;
</span>

以上方法可以直接使用类似方法  不用每次都alloc

一般都会每个类方法跟对象方法配对

<span style="font-size:18px;">[NSURL  URLWith:<#(NSString  *)#>] ;  //   返回URL类型对象

[NSString  stringWithFormat:@""] ;  //   返回NSString 类型对象 

[NSString  StringWithContentsOfFile:<#(NSString   *)#>  encoding:<:#(NSStringEncoding)#> error: nil];  // 
</span>


把字符串写到文件中[@"Jack/nJack" writeToFile:路径 atomically:YES encoding:NSUTF8StringEncoding error:nil] ;

 YES代表写入中途中断则不创作新文件    NO代表写入中途中断仍创作新文件


2. 可变的字符串NSMutableString

 

NSMutableString常用的方法有,拼接字符串到当前字符串后面:


<span style="font-size:18px;">NSMutableString  *s1 = [NSMutableString stringWithFormat:@"age  is  %10"] ;
</span>

拼接内容到s1的后面

<span style="font-size:18px;">[s1  appendString:@"11  12"] ;
NSLog(@"s1 = %@",s1);  //  s1 = age is 10  11  12</span>


删除字符串中的字符:


<span style="font-size:18px;">NSMutableString  *s1 = [NSMutableString  stringWithFormat:@"age is 10"] ;
[s1 deleteCharactersInRange:NSMakeRange(4 , 2)] ;  //    删除位置(4 , 2)的字符串
NSLog(@"s1 = %@" , s1) ;  //  s1 = age  10</span>

方法的简化:

<span style="font-size:18px;">[s1  deleteCharctersInRange:[s1  rangeOfString:@"is"]] ;    //  删除字符串is
NSLg(@"s1 = %@",s1) ;   // s1 = age 10</span>

NSString也可实现上面的字符串拼接功能,但是NSString不可变,必须要用新的值就接受拼接的字符串:

<span style="font-size:18px;">NSString  *s2 = [NSString  stringWithFormat:@"age is 10"] ;
NSString   *s3 = [s2  stringByAppendingString:@"11  12"] ;  //    s2不变  新的字符串用s3接收

NSLog(@"s2 = %@, s3 = %@", s2 , s3) ;   //    s2 = age is 10 ,  s3 = age is 10  11   12 </span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;color:#ffffff;background-color: rgb(0, 0, 0);">三、 NSArray 和NSMutableArray</span>
<span style="font-size:18px;">NSArry、 NSSet、 NSDictionary 称为集合类</span>
<span style="font-size:18px;">
</span>
<span style="font-size:18px;">1> NSArray 是数组类可以存放一些数据,只有是对象,类型是可以不同的,且存放在NSArray中是有序的</span>
<span style="font-size:18px;">为什么要引入NSArray数组类,先看C语言中数组的局限性:</span>
<span style="font-size:18px;">    C语言的数组不够灵活,只能存放一种数据类型;</span>
<span style="font-size:18px;">    C语言的数组面向过程,几乎没有什么可以操作数组的方法,且操作起来非常困难。</span>
<span style="font-size:18px;">NSArray的要求:</span>
<span style="font-size:18px;">    OC数组只能存放OC对象   不能存放非OC对象,如:int、 struct、 enum等等;</span>
<span style="font-size:18px;">    OC数组不能存放空值(数组以nil为结束)。</span>
<span style="font-size:18px;">创建一个数组:</span>
<pre name="code" class="objc"><span style="font-size:18px;">NSArray  *array = [NSArray  array] ;
</span>


 
 但是这个数组永远是空数组,因为、NSArray不可变,创建时没有指定元素,所以长度为0但又不能添加元素。 

应当这样创建:

<span style="font-size:18px;">NSArray  *array2 = [NSArray  arrayWithObject:@"jack , nil"] ;  //   并且以nil作为结束</span>


数组类的常用操作:获取数组元素的个数:

<span style="font-size:18px;">NSLog(@"%d",arry2.count) ;  //   [array  count]</span>

访问数组的元素(按索引):

<span style="font-size:18px;">NSLog(@"%@",[array3  objectAtIndex:1]);
</span>

简写方式:arr [ i ] ;

<span style="font-size:18px;">NSLog (@"%@", array3[0]);  //  编译器特性</span>

这是一种编译器特性,编译器会将array3[0]转换为 [array3  objectAtIndex:0] ;

针对NSArray的编译器特性,用于快速创建数组:@ [ ] ;

NSArray   *array4 = @[@"jack",@"rose"] ;  //  编译器特性      编译器转换成arrayWithObjects方法

注意:

       这时候不能再加上结束标识nil , 否则会报错。   




    关于数组的遍历

       方法1:

<span style="font-size:18px;">NSArray  *array = @[p, @"rose, @jack"] ;
for(int i =0;i<array.count;i++)
{
        NSLog( @"%@", array[ i ] );
}</span>

       方法2:

<span style="font-size:18px;"> //   快速遍历数组元素
for(id  obj  in  array)//   每次执行把array中一个元素赋值给obj
{
         NSUInteger  i = [array  indexOfObject:obj] ;  //   找出obj元素在数组中的位置
NSLog(@"%ld---%@", i ,obj) ;
}</span>

       方法3:

     使用遍历方法enumerate并用block做参数

<span style="font-size:18px;">//   没遍历到一个元素,就会调用一次block
//   并且当前元素和索引位置当做参数传给block
[array  enumerateObjectsUsingBlock:^(id  obj, NSUInteger  idx, BOOLBOOL  *stop)
{
        NSLog(@"%ld---%d", idx , obj) ;
}]</span>

其内部相当于执行了下面的代码:
<span style="font-size:18px;">void  ^(myblock)(id, NSUInteger, BOOLBOOL   *) = ^(id  obj,  NSUInteger  idx,  BOOLBOOL  *stop)
{
         NSLog(@"%ld - %@", idx , obj) ;
}</span>

stop 停止原理:

<span style="font-size:18px;">void  ^(myblock)(id , NSUInteger, BOOLBOOL  *) = ^(id  obj, NSUInteger  idx,BOOLBOOL  *stop)
{
         NSLog(@"%ld - %@", idx, obj);
         if(idx ==1)  // 当idx 等于1的时候停止
         {
                *stop = YES;
         }
};
for循环中
for(int i=0;i<array.count;i++)
{
       //  用来标记是否需要停止遍历
       BOOL isStop = No;
       //  取出元素
       id  obj = array[i];
       myblock(obj , i , &isStop);
       if(isStop)
       {
            break  ;
        }
}</span>





  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值