黑马程序员————IOS学习笔记 第10篇 Foundation框架

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

    这节主要是讲一些Foundation框架中常用到的结构体、类,而在c语言中的结构体,日期、数组等集合在OC中却封装成类,这样的好处在学习的过程中也略见它的好处,相信在以后开发中会有更大的作用。

一、结构体

1.NSRange  

1.认识 定义

它是一个描述字符串位置范围的一个结构体,内部包含两个变量。location表示第几个字符(从0开始),length表示从location位置开始占几个字符。

如:@“i love oc”这个字符对象,love的范围,可知location=2,lengt=4,它用oc语言表示有下面几种方法

    1>NSRange r1={2,4};//表示love的范围   不常用

     2>NSRange r2 = {.location = 2, .length = 4};  不常用

     3>NSRange r=NSMakeRange(2,4)  常用

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

如:查找某个字符窜在str中的范围,如果找不到,length=0,location=NSNotFound

   NSString *str = @"i love oc";
    NSRange range = [str rangeOfString:@"java"];   这个NSString对象的方法大可以找到它的范围
    NSLog(@"loc = %ld, length=%ld", range.location, range.length);

2.NSPoint ,NSSize,CGRect

1.定义:

NSPoint /CGPoint  它用于表示一个点,包含两个变量,x和y,即坐标上的点位置

NSSize/CGSize  它表示矩形的尺寸大小,包含两个变量,width 和height

CGRect  它表示一个矩形,包含上面CGPoint和 CGSize的两个变量

2.它们常用的表达

1>   CGPoint p1 = NSMakePoint(10, 10);

    NSPoint p2 = CGPointMake(20, 20) ; 最常用 

    CGPointZero ;表示原点,使用CGPointZero等的前提是添加CoreGraphics框架

    CGPointZero == CGPointMake(0, 0)

 2> NSSize s1 = CGSizeMake(100, 50);  常用

    NSSize s2 = NSMakeSize(100, 50);

    CGSize s3 = NSMakeSize(200, 60);

     CGSizeZero

3>  CGRect r1 = CGRectMake(0, 0, 100, 50);  

    CGRect r2 = { {0, 0}, {100, 90}};   

    CGRect r3 = {p1, s2};

    CGRectZero

4>.BOOL b=CGPointEqualToPoint(,) 比较两份点是否为一个点,使用这些CGPointEqualToPoint、CGRectContainsPoint等函数的前提是添加CoreGraphics框架

CGRectContainsPoint 比较这个矩形是否包含这个点

3.将结构体转为字符串

    NSString *str = NSStringFromPoint(p1);

    NSString *str = NSStringFromSize(s3);

    NSString *str = NSStringFromRect(r1);

    NSLog(@"%@", str);

二、常见类

1.NSString

1.字符串的创建

    NSString *s1 = @"jack";

    NSString *s2 = [[NSString alloc] initWithString:@"jack"];

    NSString *s3 = [[NSString alloc] initWithFormat:@"age is %d", 10];

 2. C字符串 转变到 OC字符串

    NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];

 3.OC字符串 转变到C字符串

    const char *cs = [s4 UTF8String];

    NSUTF8StringEncoding 用到中文就可以用这种编码

4.加载文件内容和资源

  1>  NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil]; 

   2>  NSString *s6 = [[NSString alloc] initWithContentsOfURL:urlencoding:NSUTF8StringEncoding error:nil];比较常见
    NSLog(@"s6=\n%@", s6)

其中的url可以根据想要传入的内容来赋值,它也是一个对象,如:

    URL : 资源路径

     协议头://路径

    file://
     ftp://
    例如: NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/apple/Desktop/1.txt"];

                  NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/1.txt"]; 

   注意:  一般都会有一个类方法跟对象方法配对

     [NSURL URLWithString:<#(NSString *)#>];

     [NSString stringWithFormat:@""];

     [NSString stringWithContentsOfFile:<#(NSString *)#> encoding:<#(NSStringEncoding)#> error:<#(NSError *__autoreleasing *)#>];

5. 字符串的导出

  将某个字符串写入一个文件夹
  1>  [@"Jack\nJack" writeToFile:@"/Users/apple/Desktop/my.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];

    其中的yes表示如果传入的过程中出现错误则撤销

  2>  NSString *str = @"4234234";
    NSURL *url = [NSURL fileURLWithPath:@"/Users/apple/Desktop/my2.txt"];

    [str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil

6.NSMutableString

它是可变字符串,也是NSSting的子类,可以在已经存在的字符串对象中添加新的字符。

1>创建一个可变的字符串

 NSMutableString *s1 = [NSMutableString stringWithFormat:@"my age is 10"];

2>   拼接内容到s1的后面

    [s1 appendString:@" 11 12"];

3> 获取is的范围

    NSRange range = [s1 rangeOfString:@"is"];

4>  删除

    [s1 deleteCharactersInRange:range];

5>  错误写法: 

    NSString *s2 = [NSString stringWithFormat:@"age is 10"];

   NSString *s3 = [s2 stringByAppendingString:@" 11 12"];
     

2.NSArry  

OC数组,它不能存放nil值,只能存放OC对象、不能存放非OC对象类型,比如int、struct、enum等

1.NSArray的创建

 传入单个元素:   NSArray *array2 = [NSArray arrayWithObject:@"jack"]; 

 传入多个元素:   NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose",person, nil];nil是数组元素结束的标记

 快速创建一个NSArray对象 :NSArray *array4 = @[@"jack", @"rose", @"4324324"];

  2.NSArray的元素个数

    NSLog(@"%ld", array3.count);

  3.NSArray中元素的访问

    NSLog(@"%@", [array3 objectAtIndex:1])==array3[1];

    NSLog(@"%@", array3[0]);

    注意:

    这个array永远是空数组
    NSArray *array = [NSArray array];

4.数组的遍历

数组的遍历有如下几种:

1>

for (int i = 0; i<array.count; i++)
        {
            NSLog(@"%@", array[i]);
        }

2>

    id obj代表着数组中的每一个元素
    int i = 0;
      for (id obj in array)
        {
           // 找出obj元素在数组中的位置
       NSUInteger i = [array indexOfObject:obj];
    
            NSLog(@"%ld - %@", i, obj);
           i++;
  
          if (i==1)
          {
             break;
            }
       }

3>

// 每遍历到一个元素,就会调用一次block,并且当前元素和索引位置当做参数传给block

[array enumerateObjectsUsingBlock:

     ^(id obj, NSUInteger idx, BOOL *stop)
     {
         NSLog(@"%ld - %@", idx, obj);

        // if (idx == 0)
        // {
             // 停止遍历
          //   *stop = YES;
         //}    
     }];

4>上面数组遍历的另外的形式
     void ^(myblock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *stop)
      {
            NSLog(@"%ld - %@", idx, obj);
           if (idx == 0)
           {
                // 停止遍历
                *stop = YES;
            }
        };
    for (int i = 0; i<array.count; i++)
        {
           // 用来标记是否需要停止遍历
         BOOL isStop = NO;
    
          // 取出元素
         id obj = array[i];
            
           myblock(obj, i, &isStop);        
            if (isStop)
            {
                break;
            }
        }

5.NSMutableArryy

可变数组,是NSArry的子类,它可以修改数组中的元素。

1>创建可变数组

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];
    
 2>  添加元素
    [array addObject:[[Person alloc] init]];  

    [array addObject:@"jack"];
    
 3>删除元素
    [array removeAllObjects];
    删除指定的对象
    [array removeObject:@"jack"];
    [array removeObjectAtIndex:0];
   错误写法
   [array addObject:nil];
  注意:

@[ ] 只创建不可变数组NSArray
     错误写法
    NSMutableArray *array = @[@"jack", @"rose"];
    [array addObject:@"jim"];

4.NSSet

    这个类是一种没有顺序的特殊的数组。

1.创建一个NSSet对象

NSSet *s = [NSSet set];

 NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];

2.随机拿出一个元素

  NSString *str =  [s2 anyObject];

3.元素个数

s2.count;

4.NSMutableSet

1>创建可变的NSSet

 NSMutableSet *s = [NSMutableSet set];
    
  2>  添加元素

    [s addObject:@"hack"]; 

  3> 删除元素

    [s removeObject:<#(id)#>];

5.NSSet和NSArray的对比

 1> 共同点
 * 都是集合,都能存放多个OC对象

 * 只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)

 * 本身都不可变,都有一个可变的子类

 2> 不同点

 * NSArray有顺序,NSSet没有顺序

5.NSDictionary

       顾名思义,这是一个字典类,如字典一样,知道一个字母便可找到对应的许多内容,那么NSDictionary里面放的就是 类似字典的键值。key是索引,value是对应的值。字典的无序的,字典不允许有相同的key,但允许有相同的value(Object)

1.创建一个字典

1>NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];

 2> NSArray *keys = @[@"name", @"address"];

NSArray *objects = @[@"jack", @"北京"];

NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

3>NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:

     @"jack", @"name",
     @"北京", @"address",
     @"32423434", @"qq", nil ];

4>快速创建    

    NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"};

2.根据键找到值  

id obj = [dict objectForKey:@"name"]== id obj = dict[@"name"];

NSLog(@"%@", obj);

 3.返回的是键值对的个数

    NSLog(@"%ld", dict.count);
}

4.遍历字典

1> 
    NSArray *keys = [dict allKeys];
      for (int i = 0; i<dict.count; i++)
        {
            NSString *key = keys[i];
            NSString *object = dict[key];
          NSLog(@"%@ = %@", key, object);
        }
    
 2>
    [dict enumerateKeysAndObjectsUsingBlock:
     ^(id key, id obj, BOOL *stop) {
         NSLog(@"%@ - %@", key, obj);
         
         // *stop = YES;
     }];
}

5.NSMutableDictionary

1>创建可变的字典

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    
 2>添加键值对
    [dict setObject:@"jack" forKey:@"name"];

    [dict setObject:@"北京" forKey:@"address"];   

 3>移除键值对

   [dict removeObjectForKey:<#(id)#>];    

    NSLog(@"%@", dict);

 6.数组与字典的混合使用

NSArray *persons = @[
    @{@"name" : @"jack", @"qq" : @"432423423", @"books": @[@"5分钟突破iOS编程", @"5分钟突破android编程"]},
    @{@"name" : @"rose", @"qq" : @"767567"},
    @{@"name" : @"jim", @"qq" : @"423423"},
    @{@"name" : @"jake", @"qq" : @"123123213"}
    ];   //数组里有字典,字典里面有词典

    NSDictionary *jim = persons[2]; NSLog(@"%@", jim);表示jim所在的那个字典

    NSString *bookName = persons[0][@"books"][1];      NSLog(@"%@", bookName); 先取数组0位置对应的字典,再取出自带里book数组的第2本书

   NSArray *array = persons[0][@"books"];      NSLog(@"%@", array);  将书全部放在arry数组里面

    NSLog(@"%@", persons[1][@"qq"]);    先取出1位置对应的字典,再取出字典中qq这个key对应的数据

集合的总结:

集合
 1.NSArray\NSMutableArray
 * 有序
 * 快速创建(不可变):@[obj1, obj2, obj3]
 * 快速访问元素:数组名[i]
 
 2.NSSet\NSMutableSet
 * 无序
 
 3.NSDictionary\NSMutableDictionary
 * 无序
 * 快速创建(不可变):@{key1 : value1,  key2 : value2}
 * 快速访问元素:字典名[key]

6.NSNumber

     在前面学习的集合的元素只能是对象,但是如果想要把一般数据类型放进去就需要将它们转化成对象才行,OC中的NSNumber就是一般数据类型的类,它可以将一般

剧类型包装成对象。

1.将基本数据类型转为NSNumber

NSNumber *num = [NSNumber numberWithInt:10];

int=[num intValue];

NSNumber *n = [NSNumber numberWithDouble:10.5];  

 int d = [n doubleValue];

2.数据转为NSString

    int a=20;

    NSString *str = [NSString stringWithFormat:@"%d", a];   这将20转为@"20" 即数据转为string

    NSLog(@"%d", [str intValue]);

3.快速转为NSNumber

    将各种基本数据类型包装成NSNumber对象

    @10.5;

    @YES;

    @'A';       注意:@"A"; 它是 NSString对象

  将age变量包装成NSNumber对象

    int age = 100;

    @(age);或者[NSNumber numberWithInt:age];

 7.NSDate 

OC中将日期也封装成一个NSDate类,是它是一个日期时间类.

1.创建一个时间对象

    NSDate *date = [NSDate date];

    打印出的时候是0时区的时间(北京-东8区)

    NSLog(@"%@", date);

    NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date]; 表示从运行到此行代码时间5秒钟后的时间

2. 从1970开始走过的秒数

    NSTimeInterval seconds = [date2 timeIntervalSince1970];

3 .日期的格式

可以改变日期的格式

NSDate *date = [NSDate date]

NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

    // y 年  M 月  d 日

    // m 分 s 秒  H (24)时  h(12)时

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

    NSString *str = [formatter stringFromDate:date];

    NSLog(@"%@", str);

4.将字符转成日期

    NSString *time = @"2011/09/10 18:56";

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

    formatter.dateFormat = @"yyyy/MM/dd HH:mm";

    NSDate *date = [formatter dateFromString:time];

    NSLog(@"%@", date)

7.NSValue

NSNumber之所以能包装基本数据类型为对象,是因为继承了NSValue。

1.结构体转为NSValue对象 

    CGPoint p = CGPointMake(10, 10);

     将结构体转为Value对象

    NSValue *value = [NSValue valueWithPoint:p];

2将value转为对应的结构体

    [value pointValue];

    NSArray *array = @[value ];



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值