初窥Foundation框架


一、结构体

1、NSRange(location,length)

用NSRange来表示所在位置以及长度

    NSString *str = @"love you";
    NSRange range = [str rangeOfString:@"love"];
    NSLog(@"loc = %ld,length = %ld",range.location,range.length );

打印出来的结果是:loc = 0 , length = 4,表示“love”是从位置0开始,长度为4

NSRange有一个快速创建的方法:NSRange range = NSMakeRange(2,4);

2、NSPoint/CGPoint

用NSPoint或CGPoint来表示点的位置(x,y)

    // 点的位置
    CGPoint p = {0,2};
    p.x = 10;
    p.y = 20;
    // 直接调用函数
    CGPoint p1 =  CGPointMake(20, 30);
    // 将结构体转为字符串
    NSString *str3 = NSStringFromPoint(p1);
    NSLog(@"%@",str3);

打印出来的结果是:{20,30}

    // 表示原点
    CGPoint P2 = CGPointZero;
    // 将CGPoint类型转为NSString类型
    NSString *str5 = NSStringFromPoint(P2);
    NSLog(@"%@",str5);

打印出来的结果是:{0,0}

判断两个点是否重叠

    BOOL pl = CGPointEqualToPoint(p, p1);
    NSLog(@"%d",pl);

打印出的结果是:0

3、NSSize/CGSize

用CGSize来表示长宽

    // 长度和宽度
    CGSize s = {10,20};
    s.width = 20;
    s.height = 30;

    // 将结构体转为字符串
    NSString *str4 = NSStringFromSize(s);
    NSLog(@"%@",str4);
    
    CGSize s1= CGSizeMake(20, 30);
    // 判断长宽是否相等
    BOOL sl = CGSizeEqualToSize(s, s1);
    NSLog(@"%d",sl);
打印出的结果分别为{20,30} 和 1
4、NSRect/CGRect

用CGRect来表示点位置和长宽

    // 点位置和长宽
    CGRect c = {2,3,4,5};
    c.origin = p;
    c.size = s;
    // 将结构体转为字符串
    NSString *str2 = NSStringFromRect(c);
    NSLog(@"%@",str2);
    
    CGRect  c1 = CGRectMake(3, 4, 5, 6);
    // 判断一个区域是否包含某个点
    BOOL cl = CGRectContainsPoint(c1, p);
    NSLog(@"%d",cl);
打印出的结果分别为{{10,20},{20,30}} 和 0

二、NSString与NSMutableString

1、NSString

NSString为不可变字符串,即创建了一个字符串对象之后该字符串不可改变

 /**创建字符串*/
    NSString *str = @"cx";
//  NSString *str = [[NSString alloc] initWithString:@"wj"];
    NSString *str1 = [NSString stringWithFormat:@"name = %@",str];
    
    /**C-OC字符串转换*/
    // C字符串->OC字符串
    NSString *str2 = [[NSString alloc] initWithUTF8String:"cx"];

    // OC字符串->C字符串
    const char *str3 = [str2 UTF8String];


读取文件/资源

   // URL:资源路径
    // 协议头 ://路径
    // file:// ->文件资源,本地资源
    // ftp://
    
    
    // 两种获得url的方式
    NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/c_xie/Object-C/ios.txt"];
    NSURL *url1 = [NSURL fileURLWithPath:@"/Users/c_xie/Object-C/ios.txt"];
    
    // 通过获取文件路径读取字符串
    NSString *url_1 = @"//Users/c_xie/Object-C/ios.txt";
    NSString *str6 = [NSString stringWithContentsOfFile:url_1 encoding:NSUTF8StringEncoding error:nil];
    
    // 通过URL获取资源
    NSString *str5 = [[NSString alloc] initWithContentsOfURL:url1 encoding:NSUTF8StringEncoding error:nil];
    
    NSString *str7 = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
    
    NSLog(@"%@",str7);


字符串导出到新文件

    [@"cx,wj" writeToFile:@"/Users/c_xie/myFile.txt" atomically:YES encoding:NSUTF8StringEncoding error:nil];
    
    // \n为换行符
    NSString *str8 = @"wj\ncx";
    NSURL *url2 = [NSURL fileURLWithPath:@"/Users/c_xie/myFile1.txt"];
    [str8 writeToURL:url2 atomically:YES encoding:NSUTF8StringEncoding error:nil];


2、NSMutableString

NSMutableString为可变字符串,即创建了一个字符串之后可以进行修改操作

    NSMutableString *mstr = [NSMutableString stringWithFormat:@"my age is 10"];
    
    [mstr appendString:@" 10,11"];
    
    NSLog(@"mstr=%@",mstr);

删除某个范围内的字符串

    // 用Range来确定范围
    NSRange r = NSMakeRange(4, 2);
    [mstr deleteCharactersInRange:r];
    NSLog(@"mstr=%@",mstr);
    
    NSRange r1 = [mstr rangeOfString:@"is"];
    [mstr deleteCharactersInRange:r1];
    NSLog(@"mstr=%@",mstr);

NSString类型的字符串可以有添加操作,但会产生新的对象

    NSString *str9 =@"my name is cx";
    // 生成一个新的字符串
    NSString *str0 = [str9 stringByAppendingString:@" 10 11"];
    NSLog(@"mstr=%@",str0);

三、NSArray与NSMutableArray

1、NSArray可变数组

     /*
     C语言数组
     */
    
    int number[] = {0,1,2,3,4};
    Person *p = [[Person alloc] init];
    Person *p1 = [[Person alloc] init];
    
    Person *person[] ={p,p1};
    
    
    /*
     不可变数组:NSArray
     */
    // 1、创建数组
    NSArray *array = [NSArray arrayWithObject:@"jack"];
    // nil是数组元素的结束符
    NSArray *array1 = [NSArray arrayWithObjects:@"jack",@"tom", nil];
    // 快速创建一个array对象
    NSArray *array2 = @[@"marry",@"mike",@"tmd"];
    
    
    // NSArray的元素个数
    [array2 count];
    NSLog(@"%ld",array2.count);
    
    // NSArray元素的访问
    NSLog(@"%@",[array1 objectAtIndex:1]);
    NSLog(@"%@",array2[0]);

2、遍历数组

for循环遍历

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

快速遍历

    for(id obj in array2)
    {
        //count++;
        NSUInteger count1 = [array2 indexOfObject:obj];
        NSLog(@"---%ld----%@",count1,obj);
      
    }

用enumerateObjectsUsingBlock方法遍历

        [array2 enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        NSLog(@"====%ld====%@",idx,obj);
        if(idx == 1)
        {
            // 停止循环
            *stop = YES;
        }
    }];</span>
enumerateObjectsUsingBlock遍历原理

    // 每遍历到一个元素就会调用一次block,并且当前元素和索引位置传给block
    
    // ^(id obj, NSUInteger idx, BOOL *stop)会被转为
    void (^myBlock)(id,NSUInteger,BOOL*) = ^(id obj, NSUInteger idx, BOOL *stop)
    {
        
        NSLog(@"====%ld====%@",idx,obj);
        if(idx == 1)
        {
            // 停止循环
            *stop = YES;
        }
    };
    
    // enumerateObjectsUsingBlock中依然有个for循环
    for (int j = 0; j<array2.count; j++) {
        // 用来标记是否需要停止遍历
        BOOL isStop = NO;
        id obj = array[j];
        myBlock(obj,j,&isStop); // BOOL* 是个指针参数,必须传入地址才能修改isStop这个变量的值
        if (isStop) {
            break;
        }
    }

3、NSMutableArray不可变数组

   
    NSMutableArray *array3 = [NSMutableArray arrayWithObjects:@"me",@"you",nil];
    // 添加元素
    [array3 addObject:@"he"];
    [array3 addObject:[[Person alloc] init]];
    [array3 addObjectsFromArray:array1];
    
    // 删除元素
     [array3 removeAllObjects];
     // 删除指定元素
     [array3 removeObject:@"he"];
     [array3 removeObjectAtIndex:0];

四、NSSet与NSMutableSet

1、NSSet:可变的

    NSSet *s = [NSSet 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:@"jack"];
    
    // 删除元素
     [s removeObject:@"jack"];

3、NSSet和NSArray的对比

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

不同点:NSArray有顺序,NSSet没有顺序

五、NSDictionary与NSMutableDictionary

1、NSDictionary

NSDictionary被成为OC字典,且不可变

创建NSDictionary

    NSDictionary *dir = [NSDictionary dictionaryWithObject:@"cx" forKey:@"name"];
    id obj = [dir objectForKey:@"name"];
    NSLog(@"%@",obj);
    
    NSArray *values = @[@"cx",@"bt",@"333"];
    NSArray *keys = @[@"name",@"address",@"phone"];
    NSDictionary *dic = [NSDictionary dictionaryWithObjects:values forKeys:keys];
    NSLog(@"%@",dic);
    NSLog(@"%@",dic[@"address"]);

快速创建字典

    NSDictionary *dict = @{@"name" : @"cx",@"address" : @"bt"};
    
    NSLog(@"%@",dict[@"address"]);</span>

遍历字典

    NSArray *array = [dict allKeys];
    for (int i = 0; i<dict.count; i++) {
        NSLog(@"%@ = %@",array[i],dict[array[i]]);
    }
    
    
    [dict enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        NSLog(@"%@ = %@",key,obj);
    }];

2、NSMutableDictionary

NSMutableDictionary为可变字典

    NSMutableDictionary *dic1 = [NSMutableDictionary dictionary];
    [dic1 setObject:@"sex" forKey:@"man"];
    NSLog(@"%@",dic1);
    [dic1 removeObjectForKey:@"man"];
    NSLog(@"-%@",dic1);

快速创建一个可变字典

    NSArray *person = @[@{@"name":@"wj",@"address":@"sh",@"book":@[@"ios",@"j2ee"]},@{@"name":@"cx",@"address":@"sh"}];
    
    NSString *Name = person[0][@"name"];
    
    NSLog(@"%@",person[0][@"book"][0]);
    NSLog(@"%@",Name);

六、NSNumber

NSNumber可用来创建一个基本类型的对象

    NSNumber *num = [NSNumber numberWithInt:10];
    
    NSDictionary *dict =  @{
    @"name" : @"jack",
    @"age" : num
    
    };
    
    NSNumber *num2 = dict[@"age"];
    
    
    int a = [num2 intValue];
    
    NSLog(@"%d" , a);
快速创建一个NSNumber对象

    // @20  将 20包装成一个NSNumber对像 
    NSArray *array = @[   
    @{@"name" : @"jack", @"age" : @20},   
    @{@"name" : @"rose", @"age" : @25},   
    @{@"name" : @"jim", @"age" : @27}
    ];
       
    // 将各种基本数据类型包装成NSNumber对象
    /*@10.5;
    @YES;
    @'A'; // NSNumber对象
    
    @"A"; // NSString对象
    
    */
    
    // 将age变量包装成NSNumber对象
    int age = 100;
    @(age);
    //[NSNumber numberWithInt:age];
    
    
    NSNumber *n = [NSNumber numberWithDouble:10.5];
    
    
    int d = [n doubleValue];
    
    
    
    int a = 20;
    
    // @"20"
    NSString *str = [NSString stringWithFormat:@"%d", a];
    NSLog(@"%d", [str intValue]);
    


七、NSDate

使用NSDate可快速创建一个时间对象

    // 创建一个date对象
    NSDate *date = [NSDate date];
    // 打印出的是格林时间 0时区,北京在东8区,相差8个小时
    NSLog(@"%@",date);
    
    // 在date的基础上加上5秒
    NSLog(@"%@",[NSDate dateWithTimeInterval:5 sinceDate:date]);
    
    // 计算自1970年起到date走过的秒数
    NSTimeInterval seconds = [date timeIntervalSince1970];
    NSLog(@"%f",seconds);
自定义日期格式

    /**日期转为字符串*/
    NSDate *date = [NSDate date];
    
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    // 日期格式化
    /*
     y:年
     M:月
     d:日
     h:时(24小时制)
     H:时(12小时制)
     m:分
     s:秒
     */
    formatter.dateFormat = @"yyyy-MM-dd hh:mm:ss";
    // 将日期转为字符串
    NSString *str = [formatter stringFromDate:date];
    
    NSLog(@"%@",str);
    
    /**字符串转为日期*/
    NSString *time = @"2011/09/10 18:56";
    NSDateFormatter *formatter1 = [[NSDateFormatter alloc] init];
    formatter1.dateFormat = @"yyyy/MM/dd HH:mm";
    
    NSDate *date1 = [formatter1 dateFromString:time];
    NSLog(@"%@",date1);

八、NSValue

使用NSValue可以实现将结构体转为对象,以实现将结构体放入数组

    // 结构体 -> OC对象
    CGPoint p = CGPointMake(10, 10);
    
    // 将结构体转为Value对象
    NSValue *value = [NSValue valueWithPoint:p];
    
    // 将value转为对应的结构体
    CGPoint p1 = [value pointValue];
    
    // 实现将结构体放入数组
    NSArray *array = @[value];
    
    NSLog(@"%@",array);

    return 0;

九、编写一个小程序计算文件中代码的行数

#import <Foundation/Foundation.h>
NSUInteger codeLineCount(NSString *path);

int main()
{
    NSString *path = @"/Users/c_xie/OC程序";
    NSUInteger count =  codeLineCount(path);
    NSLog(@"%ld",count);
    
    return 0;
}

NSUInteger codeLineCount(NSString *path)
{
    // 1、获得文件管理者
    NSFileManager *mdr = [NSFileManager defaultManager];
    
    // 2、判断文件是否存在以及是否是文件夹
    BOOL isdir = NO;
    BOOL exit = [mdr fileExistsAtPath:path isDirectory:&isdir];     // 修改变量需传入isdr的地址!!
    // 不存在,返回
    if(!exit) return 0;
    
    // 传入的文件是个目录directory(文件夹)
    if (isdir) {
        // 3、获取目录下的所有文件名
        NSArray *file = [mdr contentsOfDirectoryAtPath:path error:nil];
        
        
        __block int count = 0;                 // 代码行数
        // Variable is not assignable (missing __block type specifier) 可变因素不可分配(缺少__block类型区分符)
        __block NSString *fullPath;
        
        [file enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
            fullPath = [NSString stringWithFormat:@"%@/%@",path,obj];   // 不要漏写“/”
            // 4、回调函数
            count += codeLineCount(fullPath);
            //NSLog(@"%@",fullPath);
        }];
        
        return count;
        
    }
    else
    {
        // 获得文件的后缀名并转为小写字母
        NSString *extension = [[path pathExtension] lowercaseString];
        // 过滤非.h,.m ,.c文件
        if (!([extension isEqualToString:@"h"]||[extension isEqualToString:@"m"]||[extension isEqualToString:@"c"])) {
            return 0;
        }
        
        NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
        NSArray *array = [str componentsSeparatedByString:@"\n"];
        
        // 去掉路径中的/Users/c_xie/OC程序
        NSRange range = [path rangeOfString:@"/Users/c_xie/OC程序/"];
        NSString *str1 = [path stringByReplacingCharactersInRange:range withString:@""];
        
        NSLog(@"%@ - %ld",str1,array.count);
        
        return array.count;
    }
}

该程序的执行结果如下:






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值