文档章节

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

 明天过后1
发布于 2014/10/07 10:48
字数 1558
阅读 48
收藏 1

---------------------- 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



© 著作权归作者所有

共有 人打赏支持
粉丝 2
博文 23
码字总数 36166
作品 0
佛山
私信 提问
【备忘】2017年黑马【淘宝店铺装修实战操作视频】全套无加密

2017年黑马【淘宝店铺装修实战操作视频】全套无加密 简介: 淘宝装修,对于一个好的店铺来讲,是至关重要的,因为客户只能从网上的文字和图片来了解您,了解产品,所以做得好能增加用户的信任...

qq_38155396
2017/07/01
0
0
黑马程序员——集合篇

------- android培训、java培训、期待与您交流! ---------- 1、集合类 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集...

optimisticpig
2014/05/03
0
0
黑马程序员----交通灯管理系统

十字路口红绿灯通行示意图 通过上图可以看出,车到十字路口有三个选择:笔直向前、右拐弯、左拐弯,那么总共有3*4=12条路线。 分别是: E2W(东往西),E2N(东往北),E2S(东往南); S2N(南往北...

长平狐
2013/07/01
1K
0
JavaWeb01-HTML篇笔记(一)

1.1 案例一:网站信息页面的显示:1.1.1 需求: 在网页中显示网站的信息的页面:效果如下: 1.1.2 分析:1.1.2.1 技术分析: 【HTML的概述】 Ø 什么是HTML HTML:Hyper Text Markup Language ...

我是小谷粒
04/25
0
0
五.Foundation框架(1)--NSSize   NSPoint   NSRange   NSRect 结构体

在讲述框架之前,我们可以想象一个问题,那就是为什么我们每次创建文件的时候,都去选择Cocoa Class或者Cocoa Touch Class 尼? Cocoa 是什么? ocoa不是一种编程语言(它可以运行多种编程语言...

天宇逍遥heart
2016/09/20
6
0

没有更多内容

加载失败,请刷新页面

加载更多

JAVA设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,...

木木匠
56分钟前
4
0
C中的宏的使用(宏嵌套/宏展开/可变参数宏)

基本原则: 在展开当前宏函数时,如果形参有#或##则不进行宏参数的展开,否则先展开宏参数,再展开当前宏。 #是在定义两边加上双引号 #define _TOSTR(s) #sprintf(_TOSTR(test ABC))pr...

SamXIAO
今天
4
0
SpringBoot 整合异步调用方法

1. 在 SpringBoot 主类上使用 @EnableAsync 注解,开启异步调用功能 package com.codingos.springbootdemo;import org.springframework.boot.SpringApplication;import org.springfra......

北漂的我
今天
1
0
0015-如何使用Sentry管理Hive外部表权限

1.文档编写目的 本文档主要讲述如何使用Sentry对Hive外部表权限管理,并基于以下假设: 1.操作系统版本:RedHat6.5 2.CM版本:CM 5.11.1 3.集群已启用Kerberos和Sentry 4.采用具有sudo权限的...

Hadoop实操
今天
5
0
边缘计算与数据中心的发展趋势

导读 Gartner研究表明,人工智能、物联网和5G助力下一代商业创新,由此产生大量数据,2020年前企业将使用超过75亿台联网设备。 在几乎每个方面,社会的节奏都正变得更快。我们希望客户服务问...

问题终结者
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部