黑马程序员-12-Foundation(常用的集合)

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

1. OC数组

    OC数组跟C语言数组共同点 : 都是有序的,有下标的,不同的是OC数组只能存放OC对象,不能存放基本数据

      OC数组又分两种 : 不可变数组--NSArray , 可变数组--NSMutableArray

    a. NSArray : 不可变数组

            (1) 原型 :

        @interface NSArray : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>
        
        - (NSUInteger)count;                                                    // 返回数组元素个数
        - (id)objectAtIndex:(NSUInteger)index;                                  // 以索引为参数返回对应的元素
            
        @end

        

            (2) 使用

                注意 : 

                    1) OC数组不能存放nil值

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

        #import <Foundation/Foundation.h>
        
        int main(){
            // 这个array永远是空数组
            NSArray *array = [NSArray array];
            /*
             1.NSArray的创建
             */
            NSArray *array2 = [NSArray arrayWithObject:@"jack"];
        
            // nil是数组元素结束的标记
            NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", nil];
        
            // [array2 count];
            //NSArray *array4 = [NSArray arrayWithObjects:@"jack", @"rose", @"4324324", nil];
        
            // 快速创建一个NSArray对象
            NSArray *array4 = @[@"jack", @"rose", @"4324324"];
        
            /*
             2.NSArray的元素个数
             */
            NSLog(@"%ld", array3.count);
        
        
            /*
             3.NSArray中元素的访问
             */
            NSLog(@"%@", [array3 objectAtIndex:1]);
        
            //array3[1];
            NSLog(@"%@", array3[0]);
            return 0;
        }

        

        

    b. NSMutableArray : 可变数组

            (1) 原型

        @interface NSMutableArray : NSArray    
        
        - (void)addObject:(id)anObject;                                                // 添加一个元素
        - (void)insertObject:(id)anObject atIndex:(NSUInteger)index;                   // 在数组中对应的位置添加一个元素
        - (void)removeLastObject;                                                      // 删除最后一个元素
        - (void)removeObjectAtIndex:(NSUInteger)index;                                 // 根据下标删除元素
        - (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;        // 根据下标替换对应的元素
        
        @end

        

            (2) 使用 :

        // Person.h
        #import <Foundation/Foundation.h>
        @interface Person : NSObject
        
        @end
        
        @implementation Person
        
        @end
        
        // main.m
        #import <Foundation/Foundation.h>
        #import "Person.h"
        
        int main(){
            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];
            retturn 0;
          }


    c. 数组的遍历

        // Person.h
        #import <Foundation/Foundation.h>
        @interface Person : NSObject
        
        @end
        
        @implementation Person
        
        @end
        
        // main.m
        #import <Foundation/Foundation.h>
        #import "Person.h"
        
        int main(){
            Person *p = [[Person alloc] init];
            NSArray *array = @[p, @"rose", @"jack"];
            
            // 每遍历到一个元素,就会调用一次block
            // 并且当前元素和索引位置当做参数传给block
            [array enumerateObjectsUsingBlock:
                    /* 参数 
                    id :             当前遍历的元素 
                    NSUInteger :    当前遍历元素的下标
                    BOOL * :        通过修改该参数决定是否继续遍历
                    */
                 ^(id obj, NSUInteger idx, BOOL *stop)
                 {
                     NSLog(@"%ld - %@", idx, obj);
                     if (idx == 0)
                     {
                         // 停止遍历
                         *stop = YES;
                     }
                 }
             ];
            
            retturn 0;
          }


2. Set

    NSSet 和 NSArray 的比较 :

       相同点 :

        (1) 都是集合,都能存放多个OC对象

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

        (3) 本身都不可变,都有一个可变的子类NSMutableSet

        (4) 它的遍历原理都是跟NSArray一样 : 使用block来回调

    不同点 :

        (1) NSArray有顺序,NSSet没有顺序

    a. NSSet

        (1) 原型

         @interface NSSet : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>        
        
        - (NSUInteger)count;
        - (id)member:(id)object;
        - (NSEnumerator *)objectEnumerator;
        
        @end

            (2) 基本使用

        // 构建一个空集合
        NSSet *s = [NSSet set];
        // 构建一个有元素的集合
        NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];
        
        // 随机拿出一个元素
        NSString *str =  [s2 anyObject];
        
        NSLog(@"%@", str);
        
        //NSLog(@"%ld", s2.count);


    b. NSMutableSet

            (1) 原型

         @interface NSMutableSet : NSSet        
        
        - (void)addObject:(id)object;
        - (void)removeObject:(id)object;
        
        @end

            (2) 基本使用

    NSMutableSet *s = [NSMutableSet set];
    
    // 添加元素
    [s addObject:@"hack"];
    
    // 删除元素
    // [s removeObject:<#(id)#>];


3. 字典

    (1) 字典跟java中的Map思想是一样的,都是一个键跟值一一对应

    (2) 字典的元素是一个键值对,排列也是无序的

    (3) 如果同一个key放入不同的值第一个值会被覆盖

    (4) 遍历方法都是使用block

    (5) 本身都不可变,都有一个可变的子类NSMutableDitionary

    (6) 字典不允许有相同的key,但允许有相同的value(Object)

    a. NSDictionary

    (1) 原型

     @interface NSDictionary : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>    
    
    - (NSUInteger)count;
    - (id)objectForKey:(id)aKey;
    - (NSEnumerator *)keyEnumerator;
    
    @end

    (2)基本使用

    // 构建一个只有一个元素的字典对象
    // NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];
    
    // 构建一个字典 key : 一个数组 value : 一个数组 两个数组之间 key 和 value 一一对应
    // NSArray *keys = @[@"name", @"address"];
    // NSArray *objects = @[@"jack", @"北京"];
    // NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];
    
    // 构建一个多个元素的字典对象
    /*
     NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
     @"jack", @"name",
     @"北京", @"address",
     @"32423434", @"qq", nil];*/
    
    // 字典的快速构建
    NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"};
    
    // 依据 key 取出对应的元素
    // id obj = [dict objectForKey:@"name"];
    
    // 依据 key 取出对应的元素的 快速方式
    id obj = dict[@"name"];
    
    NSLog(@"%@", obj);


    b. NSMutableDitionary

        (1) 原型

     @interface NSMutableDictionary : NSDictionary
    
    - (void)removeObjectForKey:(id)aKey;
    - (void)setObject:(id)anObject forKey:(id <NSCopying>)aKey;
    
    @end

        (2) 基本使用

    // 可变字典的初始化
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    // 可变字典的快速构建
    // NSMutableDictionary *dict = @{@"name" : @"jack"};
    
    // 添加键值对
    [dict setObject:@"jack" forKey:@"name"];
    [dict setObject:@"北京" forKey:@"address"];    
    [dict setObject:@"rose" forKey:@"name"];
    
    
    // 移除键值对
    // [dict removeObjectForKey:<#(id)#>];
    
    // 依据 key 取出对应的元素的 快速方式
    NSString *str = dict[@"name"];
    
    
    //NSLog(@"%@", str);
    NSLog(@"%@", dict);
   //NSLog(@"%@", @[@"jack", @"rose"]);
   
   // 简单遍历
   [dict enumerateKeysAndObjectsUsingBlock:
     ^(id key, id obj, BOOL *stop) {
         NSLog(@"%@ - %@", key, obj);
         
         // *stop = YES;
     }];


4. Foundation应用 : 计算代码行数

/*
    计算代码行数
  
    path:文件路径,绝对路径 .m .mm .c .h
  
    返回值:该路径下文件代码行数
  
*/
NSUInteger getFileCount(NSString *path)
{
    // 判断路径结尾是否有 "/"存在,有则去掉
    NSString *last = [path substringFromIndex:(path.length - 1)];
    // NSLog(@"%@",last);
    BOOL isEqual = [last isEqualToString:@"/"];
    if( isEqual ){
        NSRange r = NSMakeRange(0, path.length - 1);
        path = [path substringWithRange:r];
    }
     
    // 获得文件管理器
    NSFileManager *fileManager = [NSFileManager defaultManager];
     
    // 判断文件是否存在,并判断是否父路径
    BOOL isFolder = NO;
    BOOL exist = [fileManager fileExistsAtPath:path isDirectory:&isFolder];
     
    if( !exist ){
        // 不存在则返回
        NSLog(@"%@ 路径下的文件不存在",path);
        return 0;
    }
     
    NSUInteger count = 0;
     
    if( isFolder ){ // 文件夹
        // 遍历该目录下所有文件
        NSArray *fileArray = [fileManager contentsOfDirectoryAtPath:path error:nil];
        for (NSString *item in fileArray) {
            // 拼接子路径
            NSString *subPath = [NSString stringWithFormat:@"%@/%@", path,item];
            count += getFileCount(subPath);
        }
        return count;
         
    } else { //文件
        // 只计算 .m .h .c .mm
        NSString *extension = [path pathExtension];
     
        if( ([extension isEqualToString:@"m"]) || ([extension isEqualToString:@"h"])
           || ([extension isEqualToString:@"c"]) || ([extension isEqualToString:@"mm"])){
         
            // 获得文件内容
            NSString *content = [NSString stringWithContentsOfFile:path encoding:(NSUTF8StringEncoding) error:nil];
         
            // 以\n作为分隔符把文本分隔
            NSArray *array = [content componentsSeparatedByString:@"\n"];
         
            return count += array.count;
        }
        return 0;
    }
     
}


5. 总结

    (1) 集合都是可以放入任何OC对象,对于非OC对象不能放进集合里面

    (2) 集合本身不可变,但都有一个可变大小的子类

    (3) 集合遍历思想都是通过回调block来控制实现

    (4) 集合的父类都是 NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>


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

 详情请查看:http://edu.csdn.net/heima



你可能感兴趣的:(黑马程序员-12-Foundation(常用的集合))