黑马程序员——Foundation框架学习——OC结构体、字符串、OC集合、NSNumber,NSValue、OC时间对象

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

一、 OC结构体

OC中给我们封装好了一些结构体供我们使用

如:

NSRange(location length) :用于标记字符串中某个字符或者字符串的位置或者长度
 NSPoint\CGPoint:记录屏幕中一个点的位置。
 NSSize\CGSize: 记录屏幕中区域的范围,长 和 宽。
 NSRect\CGRect (CGPint CGSize):用于记录屏幕中某一确定范围,它包括:点NSPoint\CGPoint,和范围:NSSize\CGSize。这样就可以确定一个区域了。


上面的方法名有NS开头和CG开头,CG开头的结构体具有跨平台性。


在iOS中我们将屏幕的左上方设为原点。

NSRect\CGRect中计算屏幕大小方式:以点坐标向下和向左加上范围长和宽。


1. NSRange(location length)的使用

 //确定 @"i love oc"  中 love的范围
    
    //NSRange r1 = {2, 4}; // 不用
    //NSRange r2 = {.location = 2, .length = 4};// 不用
    //NSRange r3 = NSMakeRange(2, 4); // 掌握
    NSString *str = @"i love oc";
    
    // 查找某个字符串在str中的范围
    // 如果找不到,length=0,location=NSNotFound==-1
    NSRange range = [str rangeOfString:@"java"];
    NSLog(@"loc = %ld, length=%ld", range.location, range.length);

在找不到字符串范围结果的时候:location=NSNotFound==-1  一般显示结果不是-1 是一串数字,是因为location类型为unsigned long 无符号 将-1以无符号的形式输出了


2.NSPoint\CGPoint 、NSSize\CGSize、NSSize\CGSize的使用

 CGPoint p1 = NSMakePoint(10, 10); // 点(10, 10)
    NSPoint p2 = CGPointMake(20, 20); // 最常用。点(20, 20)
    
    NSSize s1 = CGSizeMake(100, 50); // 宽:100,高:50
    NSSize s2 = NSMakeSize(100, 50); // 宽:100,高:50
    
    CGRect r1 = CGRectMake(0, 0, 100, 50);
    CGRect r2 = { {0, 0}, {100, 90}};
    CGRect r3 = {p1, s2};
    
    // 表示原点
    // CGPointZero == CGPointMake(0, 0)

    // 使用CGPointZero等的前提是添加CoreGraphics框架
    CGRect r4 = {CGPointZero, CGSizeMake(100, 90)};
    
    // 将结构体转为字符串
    NSString *str1 = NSStringFromPoint(p1);
    
    NSString *str2 = NSStringFromSize(s2);
    
    NSString *str3 = NSStringFromRect(r3);
    
    NSLog(@"%@--%@--%@", str1, str2, str3);
    
    /*
     输出结果:
     {10, 10}--{100, 50}--{{10, 10}, {100, 50}}
     结构体转换成字符串后输出相应的点坐标,范围大小和位置。
     */
    /*
     NSLog(@"(x=%f, y=%f), (width=%f, height=%f)", r3.origin.x, r3.origin.y, r3.size.width, r3.size.height)  ==     NSLog(@"%@", str3);

    */

3. 结构体的一些方法

1> 比较两个点是否相同

// 比较两个点是否相同(x、y)
    BOOL b = CGPointEqualToPoint(CGPointMake(10, 10), CGPointMake(10, 10));

2> 判断一个区域是否含有某个点

//区域的范围 x (50, 150) y (40 , 90)
    BOOL b2 = CGRectContainsPoint(CGRectMake(50, 40, 100, 50), CGPointMake(60, 45));

使用这些CGPointEqualToPoint、CGRectContainsPoint等函数的前提是添加CoreGraphics框架,Xcode6.2中不需要。


二、 字符串

1、字符串的创建

  直接创建:    NSString *s1 = @"jack";  ====   NSString *s2 = [[NSString alloc] initWithString:@"jack"];
 

字符串带参数: 

     int a = 10;

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

C字符串 --> OC字符串

初始化方法:initWithUTF8String
    NSString *s4 = [[NSString alloc] initWithUTF8String:"jack"];


 OC字符串 --> C字符串
    const char *cs = [s4 UTF8String];
    
    // NSUTF8StringEncoding 用到中文就可以用这种编码
    NSString *s5 = [[NSString alloc] initWithContentsOfFile:@"/Users/apple/Desktop/1.txt" encoding:NSUTF8StringEncoding error:nil];

 将本地文件作为字符串导出

        NSString *str5 = [[NSString alloc] initWithContentsOfFile:@"/Users/dymost/Desktop/作业.m" encoding:NSUTF8StringEncoding error:nil];
        NSLog(@"\n%@", str5);  // 输出结果为文件内容


将文件以字符串形式导出和保存,一般用URL。 URL也叫资源路径,分为本地文件和服务器文件。

     格式 --> 协议头://路径
     本地文件:  file:///Users/dymost/Desktop/作业.m
     网络文件:
     ftp://
     http://www.baidu.com


(NSString *) 在xcode6.2中不支持中文路径 !!! 否则打印无结果, 换成没有中文字符的路径,则成功
     NSURL *url = [NSURL alloc] initWithString:<#(NSString *)#>
     NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/dymost/Desktop/作业.m"];
     
     NSString *str6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
     NSLog(@"%@", str6);
     
     输出结果:2015-04-01 10:34:39.039 02-NSString字符串[568:28985] (null)
     Program ended with exit code: 0

成功输出文件内容

        NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/dymost/Desktop/m.m"];
        NSString *str6 = [[NSString alloc] initWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
        NSLog(@"\n%@", str6);

xcode 6.2 fileURLWithPath 中可以出现中文字符
    NSURL *url2 = [NSURL fileURLWithPath:@"/Users/dymost/Desktop/作业.m"];
    NSString *str7 = [[NSString alloc] initWithContentsOfURL:url2 encoding:NSUTF8StringEncoding error:nil];
    NSLog(@"\n%@", str7);  // 输出文件内容



字符串还分为可变字符串和不可变字符串

一般创建的NSString 字符串是不可变字符串,既创建完后不可再改变。

可变字符串是用NSMutableString创建的,创建完后可以改变。

比如调用方法在可变字符串后面拼接字符串,调用appendString方法[字符串指针 appendString:字符串];

可变字符串的一些方法:

        // 创建可变字符串
        NSMutableString *s1 = @"dymost";
        // 创建带有参数的可变字符串
        NSMutableString *s2 = [NSMutableString stringWithFormat:@"dymost age is %d", 23];
        
        // 在可变字符串后拼接字符串
        [s1 appendString:@"age"]; // 不带参数
        [s1 appendFormat:@" is %d", 23]; // 带参数
        
        // 获取is的范围
        NSRange range = [s2 rangeOfString:@"is"];
        
        // 删除is
        [s2 deleteCharactersInRange:range];
        

三、 OC的集合

1、 OC数组NSArray\NSMutableString

OC数组存储的时对象,在后面引用别的方法来使OC数组能存储基本数据类型。

OC数组也分为可变的和不可变的两种。

1--->不可变数组NSArray

     1.OC数组的创建
     [NSArray array]  一直为空 
     [NSArray arrayWithObject:id]; 存储单个对象
     [NSArray arrayWithObject:多个对象, nil];  存储多个对象
     @[对象1, 对象2, 对象3……]; 快速创建对象

    NSArray *array1 = [NSArray array];
    NSArray *array2 = [NSArray arrayWithObject:@"dymost"];
    NSArray *array3 = [NSArray arrayWithObjects:@"dymost", @"dimost", nil];
    NSArray *array4 = @[@"dymost", @"dimost"];

     OC数组中不能有nil,因为OC数组默认将nil当成OC数组元素结束的标志
     OC数组可以存放不同类型的OC对象,但仅仅只能存放OC对象,基本数据类型不能存放,比如int,struct、enum等
     NSArray 是不可变数组当数组创建时没有赋值初始化,将一直是空
     
     2. 访问OC数组中元素的个数(得出数组元素个数)
     点语法:  数组名.count
     调用对象方法:  [数组名 count];

int a = array1.count;
int b = [array1 count];
    
     3. OC数组中元素的访问
     1> 调用对象方法
     [oc数组名 objectAtIndex: 位置序号]
     2> OC数组名[位置序号]
    NSLog(@"%@", array3[1]);
    NSLog(@"%@", [array3 objectAtIndex:1]);

    4.遍历数组中的对象

     1>通常方法for循环,不用代码块block

        Person *p1 = [[Person alloc]init];
        Person *p2 = [[Person alloc]init];
        Person *p3 = [[Person alloc]init];

        NSArray *arr = @[p1, p2, p3];
        for (int i = 0; i < arr.count; i++) {
            NSLog(@"%@", arr[i]);
        }

      2>特殊for循环

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

      3>利用block代码块,调数组方法 enumerateObjectsUsingBlock

[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            NSLog(@"%ld - %@",idx, obj);
            if (idx == 1) {
                *stop = YES;
            }
        }];


2-->可变数组的基本使用

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];
    
    // 添加元素
    [array addObject:[[Person alloc] init]];
    
    [array addObject:@"jack"];
    
    // 删除元素
    //[array removeAllObjects];
    // 删除指定的对象
    // [array removeObject:@"jack"];
    [array removeObjectAtIndex:0];
    
    // 错误写法
    // [array addObject:nil];

2、 NSSet\NSMutableSet

NSSet和NSArray的对比
 1> 共同点
 * 都是集合,都能存放多个OC对象
 * 只能存放OC对象,不能存放非OC对象类型(基本数据类型:int、char、float等,结构体,枚举)
 * 本身都不可变,都有一个可变的子类
 
 2> 不同点
 * NSArray有顺序,NSSet没有顺序


1-->NSSet的基本使用

NSSet *s = [NSSet set]; // 创建一个空Set,直到消失都是空
    
    NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];
    
    // 随机拿出一个元素
    NSString *str =  [s2 anyObject];
    
    NSLog(@"%@", str);
    
    // 计算Set其中存储的对象个数
    NSLog(@"%ld", s2.count);

2-->NSMutableSet的基本使用

    NSMutableSet *s = [NSMutableSet set];
    
    // 添加元素
    [s addObject:@"hack"];
    
    // 删除元素
    [s removeObject:<#(id)#>]; // 参数填写的是对象,写哪个对象删除哪个对象


 3、 NSDictionary\NSMutableDictionary

字典中存储的对象是一对一对的,我们称之为键值对。

      key ----> value
     索引 ----> 文字内容

1> 创建不可变字典

   // 字典存储一个键值对的方法
    NSDictionary *dict = [NSDictionary dictionaryWithObject:@"dymost" forKey:@"name"];
    
    // 字典存储多个键值对的方法
    NSArray *value = @[@"dimsot", @"beijin"];
    NSArray *key = @[@"name", @"address"];
    NSDictionary *dics = [NSDictionary dictionaryWithObjects:value forKeys:key];
    // 或者NSDictionary *dics = [NSDictionary dictionaryWithObjects:@"dimsot", @"beijin" forKeys:@"name", @"address"];
    NSDictionary *dic1 =[NSDictionary dictionaryWithObjectsAndKeys:
                         @"dymost",@"name",
                         @"北京",@"address",
                         @"867036316",@"QQ",
                         nil];
    NSDictionary *dic2 = @{@"name" : @"dymost", @"address" : @"北京"};

     字典是通过索引key 来寻找内容value的

    id obj = [dic1 objectForKey:@"name"];
    id obj1 = dic2[@"name"];

     获取字典中键值对的个数

    NSLog(@"\n%ld", dics.count); // .count 返回的时键值对个数
    NSLog(@"%d",[dic2 count])

     直接输出字典

    NSDictionary *dic2 = @{@"name" : @"dymost", @"address" : @"北京"};
    NSLog(@"%@", dic2);

结果是,是不能输出汉字的,且为随机输出键值对

 {
    address = "\U5317\U4eac";
    name = dymost;
}

2> 可变字典基本使用

    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    
    // 直接初始化赋值
    NSMutableDictionary *dict1 = @{@"name" : @"dymost"};
    // 添加键值对
    [dict setObject:@"dymost" forKey:@"name"];
    [dict setValue:@"beijin" forKey:@"address"];
    Person *p = [[Person alloc] init];
    [dict setObject:p forKey:@"obj"];
    
    // 移除键值对
    [dict removeObjectForKey:@"name"];
    
    NSString *str = dict[@"obj"]; // 可以将对象赋值给字符串
    
    //打印可变字符串
    NSLog(@"%@",dict1);
    NSLog(@"%@", @[@"jack", @"rose"]);

3、 字典是的一些使用注意和方法

字典不允许有相同的key,但允许有相同的value(object)
字典存储的时候是无序的。

和NSArray 同类方法变量字典

[dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@ --- %@", key, obj);
        *stop = YES;
    }];

4、 字典数组相互嵌套

 NSArray *arr = @[
                     @{@"name" : @"dymost", @"address" : @"beijin", @"book" : @[@"Object-C", @"C语言"]},
                     @{@"name" : @"dimost", @"QQ" : @"86703616"}
                     ];

输出其中信息

    NSString *bookName = arr[0][@"book"][1];
    NSLog(@"%@", bookName);
    
    NSArray *array =arr[0][@"book"];
    NSLog(@"%@", array);

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


四、 NSNumber和NSValue

这两个类就是将基本数据类型包装成类,使得OC集合可以进行存储。

1、 NSNumber

1>将int型包装成NSNumber对象

    NSNumber *num = [NSNumber numberWithInt:10];

   快速方法: @“10”

2> 将  NSNumber 对象转成int型

    int a = [num intValue];

3> 将其他基本类型转成 NSNumber

double: @“10.3”

BOOL: @“YES”

char: @"c"

字符串: @“a”

    // 将age变量包装成NSNumber对象
    int age = 100;
    @(age);

4> 将NSNumber转成 其他类型

方法

[NSNumber对象  doubleValue]

[NSNumber对象  charValue]

[NSNumber对象  BOOLValue]

[NSNumber对象  stringValue]


2、 NSValue

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

NSValue不仅能转换基本数据类型,还能转换结构体

    CGPoint p = CGPointMake(10, 10);
    // 将结构体转为Value对象
    NSValue *value = [NSValue valueWithPoint:p];
    
    // 将value转为对应的结构体
    // [value pointValue];
    
    NSArray *array = @[value ];

五、 OC的时间的时间对象 NSDate

创建时间对象

    NSDate *date = [NSDate date];  // 对象中默认记录系统时间格林时区0时区

打印时间对象

NSLog(@"%@", date);


创建比现在时间早几秒的时间对象方法

    NSDate *date2 = [NSDate dateWithTimeInterval:5 sinceDate:date];

还有一种创建时间对象的方式,计算从1970年1月1号00时00分00秒 到现在的秒数

    NSTimeInterval seconds = [date2 timeIntervalSince1970];

记录到现在的秒数

[date2 timeIntervalSinceNow];

格式化输出日期的方法

首先要创建日期格式化类

    // 日期格式化类
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // 再调用日期格式化 对象方法 dateFormat 来规定日期格式

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

    NSDate *date = [NSDate date];

    NSString *str = [formatter stringFromDate:date];
    
    NSLog(@"%@", str);

将字符串转换成时间对象的方法,用上面的日期格式输出

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

NSDate *date = [formatter dateFromString:time];
    NSLog(@"%@", date);

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值