黑马程序员-OC学习笔记之Foundatio框架集合类

---------------------- IOS开发Android培训、期待与您交流!
----------------------

一、OC数组

OC数组是一个类,它也分不可变数组NSArray和可变数组NSMutableArray。

1?不可变数组的创建

    // 创建一个不可变数组,元素为一个OC字符串对象 @"小桥"
    NSArray *array1 = [NSArray arrayWithObject:@"小桥"];

    // 创建一个不可变数组,元素为多个OC字符串对象
    NSArray *array2 = [NSArray arrayWithObjects:@"葬花 桥", @"120岁", @"来自武汉" , nil];
       // 快速创建一个不可变数组
    NSArray *array3 = @[@"葬花 桥", @"120岁", @"来自武汉"]; // 这是Xcode的一个特性,它会把这句自动转换成上面那句

快速创建数组@[]和 @"" 一样都是Xcode会自动替换成完整的语句,后面还有很多其它的,像@{}等等。

2?OC数组的元素个数统计

在C中的数组中,数组的下标就是数组元素的个数,OC数组中提供了count对象方法,如:

        // 输出array3的元素个数
        NSLog(@"数组元素个数=%ld", array3.count);

array3.count  调用数组的count方法就会返回元素的个数。

3?OC数组的访问

C数组的访问很简单,a[i]    这就是访问数组a的第 i  个元素,OC数组中访问指定元素如下:

        // 访问数组元素
        NSLog(@"第%d个元素为%@", 0, [array3 objectAtIndex:0]);

苹果官方为和简化,又提供了Xcode的新特性,OC数组的访问变得简单,可以和C数组有一样的写法:

NSLog(@"第%d个元素为%@", 1 , array3[1]); 

简化的写法依然是编译器自动替换成上一个写法,所以虽然写法一样但本质不同。

4?OC数组的遍历

1.C中的数组遍历也可以用在OC数组中:

        // 1.传统遍历方法
        for (int i=0; i<array3.count; i++)
        {
            NSLog(@"第%d个元素---%@", i, array3[i]);
        } 

这是面向过程的数组遍历,下面两种是面向对象的数组遍历:

2.

        // 2.OC遍历
        unsigned long i = 0; // 记住当前下标
        for (NSString *obj in array3) // array3中的对象全部是OC字符串,如果不是同一种类型就用 id
        {
            i = [array3 indexOfObject:obj]; // 获取当前元素的下标
            NSLog(@"第%ld个元素---%@", i, obj);
        } 

这种遍历不能获取当前的下标,必须定义标志变量 i

3.bloc遍历

        // 3.block遍历,调用enumerateObjectsUsingBlock: 方法,传递一个block参数
        [array3 enumerateObjectsUsingBlock:
         ^(id obj, NSUInteger idx, BOOL *stop) // 这些参数由方法enumerateObjectsUsingBlock传递过来
        {
            NSLog(@"第%ld个元素----%@", idx, obj); // 对数组元素的操作在block中进行
        }]; 

按小桥的理解block遍历并不是在block中访问的OC数组,而在 enumerateObjectsUsingBlock:这个方法中,其中     
             的for循环中获取数组当前元素赋值给obj,而我们可以在block参数中写我们要执行的一些代码来操作数组元素,enumerateObjectsUsingBlock:方法每循环一次就调用一次block执行我们的代码,其中
*stop是一个地址传递的标志参数,可以控制循环是否继续下去,如果在block中赋值为 YES 那么遍历将停止。

5?可变数组的创建和使用

因 为可变数组类是不可变数组类的子类,所以继承了父类的方法,使用相同,小桥这里主要讲下它自己独有的方法。

添加元素 :

        // 子类有父类的方法
        NSMutableArray *array4 = [NSMutableArray arrayWithObjects:@"葬花", @"桥" , nil];

        // 添加元素
        [array4 addObject:@"今天天气又不好"];

添加元素后数组中就多了一个元素

删除元素 :

            // 删除元素全部元素
            [array4 removeAllObjects];

            // 删除指定元素
            [array4 removeObject:@"桥"];

这只是两个,还有很多,小桥就不一一列举了。

以上就是OC数组的内容,小桥把用到的全部代码拷贝上来:

//
//  main.m
//  OC数组
//
//  Created by 葬花 桥 on 14-5-18.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

int main()
{
    /*---------------------------------------------------------------
     数组的创建
     ---------------------------------------------------------------*/
    // 创建一个不可变数组,元素为一个OC字符串对象 @"小桥"
    NSArray *array1 = [NSArray arrayWithObject:@"小桥"];

    // 创建一个不可变数组,元素为多个OC字符串对象
    NSArray *array2 = [NSArray arrayWithObjects:@"葬花 桥", @"120岁", @"来自武汉" , nil];

    // 快速创建一个不可变数组
    NSArray *array3 = @[@"葬花 桥", @"120岁", @"来自武汉"]; // 这是Xcode的一个特性,它会把这句自动转换成上面那句
    // 输出array3的元素个数
    // NSLog(@"数组元素个数=%ld", array3.count);

    // 访问数组元素
    // NSLog(@"第%d个元素为%@", 0, [array3 objectAtIndex:0]);
    // NSLog(@"第%d个元素为%@", 1 , array3[1]);

    /*---------------------------------------------------------------
     数组的遍历
     ---------------------------------------------------------------*/

    // 1.传统遍历方法
    for (int i=0; i<array3.count; i++)
    {
       // NSLog(@"第%d个元素---%@", i, array3[i]);
    }

    // 2.OC遍历
    unsigned long i = 0; // 记住当前下标
    for (NSString *obj in array3) // array3中的对象全部是OC字符串,如果不是同一种类型就用 id
    {
        i = [array3 indexOfObject:obj]; // 获取当前元素的下标
        //NSLog(@"第%ld个元素---%@", i, obj);
    }

    // 3.block遍历,调用enumerateObjectsUsingBlock: 方法,传递一个block参数
    [array3 enumerateObjectsUsingBlock:
     ^(id obj, NSUInteger idx, BOOL *stop) // 这些参数由方法enumerateObjectsUsingBlock传递过来
    {
        // NSLog(@"第%ld个元素----%@", idx, obj); // 对数组元素的操作在block中进行
        if (idx == 1)
        {
            *stop = YES; // 当当前索引为 1 时停止遍历
        }
    }];

    /*---------------------------------------------------------------
     可变数组的创建和使用
     ---------------------------------------------------------------*/
    // 子类有父类的方法
    NSMutableArray *array4 = [NSMutableArray arrayWithObjects:@"葬花", @"桥" , nil];

    // 添加元素
    [array4 addObject:@"今天天气又不好"];

    // 删除元素全部元素
    [array4 removeAllObjects];

    // 删除指定元素
    [array4 removeObject:@"桥"];

    for (id obj in array4)
    {
        NSLog(@"array4---%@", obj);
    }

    return 0;
} 

二、NSSet

NSSet也是一个集合,它和NSArray相似,可以存放多个OC对象,但是不能存放基本数据,本身也不能改变,但是子类可以改变,不同的是,NSSet没有顺序,而NSArray有顺序。

三、NSDictionary

字典类也是一个集合类,它里面存放的都是键--值对,通过键(key)就能找到值(value)。

1?字典的创建和使用

           // 创建单个键值对字典
          NSDictionary *dic = [NSDictionary dictionaryWithObject:@"葬花" forKey:@"姓"];
          // 创建多个键值对的字典
          NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:
                          @"葬花", @"姓",
                          @"桥", @"名",
                          @"44125", @"QQ", nil];
          // 快速创建字典
          NSDictionary *dic3 = @{@"姓" : @"葬花"};

dic中存放着一个键值对,@"姓" 和 @"葬花" 。通过key索引就能找到对应的值:

        id obj = [dic objectForKey:@"姓"];
        // 快速查找值
        id obj3 = dic3[@"姓"];

2?可变字典

和数组一样 ,它的一个子类,也可以在已有的字典上添加键值对,删除键值对。

创建可变字典

        // 创建一个空的字典
        NSMutableDictionary *dic4 = [NSMutableDictionary dictionary];
        // 添加键值对
        [dic4 setObject:@"桥" forKey:@"名字"];
        [dic4 setObject:@"120岁" forKey:@"年龄"];
        [dic4 setObject:@"武汉" forKey:@"地址"];
        [dic4 setObject:@"44125" forKey:@"QQ"];

删除键值对

        // 删除键值对
        [dic4 removeObjectForKey:@"年龄"];

字典遍历

        // 字典的遍历
        NSArray *keys = [dic4 allKeys]; // 找出所有key
        for (int i=0; i<dic4.count; i++)
        {
            NSString *key4 = keys[i];
            NSString *obj4 = dic4[key4]; // 找出key对应的value
            NSLog(@"%@ = %@", key4, obj4);
        }
      // block遍历
        [dic4 enumerateKeysAndObjectsUsingBlock:
         ^(id key, id obj, BOOL *stop)
        {
            NSLog(@"%@ = %@", key, obj);
        }]; 

数组与字典的嵌套

             // 数组中的元素为字典,每个字典为一个人的信息
             NSArray *array = @[
                       @{@"姓名" : @"葬花 桥", @"年龄" : @"120岁", @"QQ" : @"44125"},
                       @{@"姓名" : @"SouBanaQiao", @"年龄" : @"20岁", @"QQ" : @"123456"},
                       @{@"姓名" : @"一休", @"年龄" : @"13岁", @"QQ" : @"4568651"}];

            // 访问数组中的字典元素中的键值对
            NSString *str = array[0][@"QQ"]; // 取出数组中的第0个字典元素,再取出字典key对应的value
            NSLog(@"%@", str);

不难理解,array是一个oc数组,其它的每个元素为字典对象,注意这里的访问与C中的二维数组的访问的区别,这里只是用了编译器特性,它本质上是方法调用。

还可以再嵌套

         // 数组中的元素为字典,每个字典为一个人的信息,元素0中的字典中的QQ有两个
         NSArray *array2 = @[
                       @{@"姓名" : @"葬花 桥", @"年龄" : @"120岁", @"QQ" : @[@"44125", @"1234"]},
                       @{@"姓名" : @"SouBanaQiao", @"年龄" : @"20岁", @"QQ" : @"123456"},
                       @{@"姓名" : @"一休", @"年龄" : @"13岁", @"QQ" : @"4568651"}];

        // 访问数组中的字典元素中的键值对
        NSString *str2 = array2[0][@"QQ"][1];
        NSLog(@"%@", str2);

这里是数组中套字典,再在字典中套数组,第0个元素字典中的QQ键对应的值是一个数组,所以这里会输出

1234

小桥最后附上写笔记用到的所有字典代码

//
//  main.m
//  NSDictionary
//
//  Created by 葬花 桥 on 14-5-18.
//  Copyright (c) 2014年 itcast. All rights reserved.
//

#import <Foundation/Foundation.h>

int main()
{
    /*---------------------------------------------------------------
     字典的创建和使用
     ---------------------------------------------------------------*/
    // 创建单个键值对字典
    NSDictionary *dic = [NSDictionary dictionaryWithObject:@"葬花" forKey:@"姓"];
    // 通过索引找到值
    id obj = [dic objectForKey:@"姓"];

    // 创建多个键值对的字典
    NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:
                          @"葬花", @"姓",
                          @"桥", @"名",
                          @"44125", @"QQ", nil];
    // 快速创建字典
    NSDictionary *dic3 = @{@"姓" : @"葬花"};
    // 快速查找值
    id obj3 = dic3[@"姓"];

    // NSLog(@"%@", obj3);

    /*---------------------------------------------------------------
     可变字典的创建和使用
     ---------------------------------------------------------------*/
    // 创建一个空的字典
    NSMutableDictionary *dic4 = [NSMutableDictionary dictionary];
    // 添加键值对
    [dic4 setObject:@"桥" forKey:@"名字"];
    [dic4 setObject:@"120岁" forKey:@"年龄"];
    [dic4 setObject:@"武汉" forKey:@"地址"];
    [dic4 setObject:@"44125" forKey:@"QQ"];

    // 删除键值对
    [dic4 removeObjectForKey:@"年龄"];

    // 字典的遍历
    NSArray *keys = [dic4 allKeys]; // 找出所有key
    for (int i=0; i<dic4.count; i++)
    {
        NSString *key4 = keys[i];
        NSString *obj4 = dic4[key4]; // 找出key对应的value
        // NSLog(@"%@ = %@", key4, obj4);
    }
    // block遍历
    [dic4 enumerateKeysAndObjectsUsingBlock:
     ^(id key, id obj, BOOL *stop)
    {
       // NSLog(@"%@ = %@", key, obj);
    }];

    /*---------------------------------------------------------------
     字典与数组的嵌套
     ---------------------------------------------------------------*/
    // 数组中的元素为字典,每个字典为一个人的信息
    NSArray *array = @[
                       @{@"姓名" : @"葬花 桥", @"年龄" : @"120岁", @"QQ" : @"44125"},
                       @{@"姓名" : @"SouBanaQiao", @"年龄" : @"20岁", @"QQ" : @"123456"},
                       @{@"姓名" : @"一休", @"年龄" : @"13岁", @"QQ" : @"4568651"}];

    // 访问数组中的字典元素中的键值对
    NSString *str = array[0][@"QQ"]; // 取出数组中的第0个字典元素,再取出字典key对应的value
    // NSLog(@"%@", str);

    // 数组中的元素为字典,每个字典为一个人的信息,元素0中的字典中的QQ有两个
    NSArray *array2 = @[
                       @{@"姓名" : @"葬花 桥", @"年龄" : @"120岁", @"QQ" : @[@"44125", @"1234"]},
                       @{@"姓名" : @"SouBanaQiao", @"年龄" : @"20岁", @"QQ" : @"123456"},
                       @{@"姓名" : @"一休", @"年龄" : @"13岁", @"QQ" : @"4568651"}];

    // 访问数组中的字典元素中的键值对
    NSString *str2 = array2[0][@"QQ"][1];
    NSLog(@"%@", str2);
    return 0;
}

---------------------- IOS开发Android培训、期待与您交流!
---------------------- 详细请查看:www.itheima.com

黑马程序员-OC学习笔记之Foundatio框架集合类

时间: 2024-10-23 04:39:12

黑马程序员-OC学习笔记之Foundatio框架集合类的相关文章

黑马程序员-OC学习笔记之Foundation框架NSNumber、NSValue和NSDate

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSNumber 前几篇笔记中,小桥复习了Foundatio框架中的几个类,这三个是OC学习的尾声了. 小桥已经复习过OC数组类NSArray,也说过它只能存放OC的对象,对于基本的数据类型确无能为力,但是实际编程中经常要把基本的数据如int.float,结构体存放的OC数组中,怎么办?这里的NSNumber就有用了,它能够把基本数据类型包装成OC对象.

黑马程序员_OC学习笔记之Foundation框架集合类

OC--集合类 1.OC集合类包括NSArray,NSSet,NSDictionary都是以面向对象的方式操作数组,而且OC数组不像C语言中的数组只能存放同一种数据类型,它可以存放任意类型的对象,但是不能存放非OC对象类型如基本数据类型int,struct,enum等 2.OC数组是以对象的方式存在,因此在创建的时候需要为创建的对象前面加* 3.NSArray数组一旦创建就决定了是不是可变,而且永远是可变或不可变 4.NSArray数组和子类NSMutableArray的基本操作: 1>使用NS

黑马程序员-OC学习笔记之block

过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 9426    Accepted Submission(s): 4151 Problem Description RPG girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了.可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做par

黑马程序员-OC学习笔记之ARC

---------------------- IOS开发.Android培训.期待与您交流! ----------------------一.什么是ARC        ARC是自动引用计数,苹果官方在Xcode4.2及以后版本中加入的一个内存管理机制,完全取代了程序员人工的内存管理,使得程序员只须关心程序本身.使用ARC,编译器会自动在代码中加入内存管理代码,是一个编译器特性,而不是运行时特性,当然,它也和JAVA的垃圾回收不同,它的本质和手动的内存管理是一样的,只是这些代码编译器会自动添加.

黑马程序员-OC学习笔记之NSString与NSMutableString

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.NSString与NSMutableString 相信大家对NSString类都不陌生,它是OC中提供的字符串类,它的对象中的字符串都是不可变的,而它的子类NSMutableString类的对象中的字符串就是可变的.什么是可变与不可变呢?二者的区别就是在已经创建的一个字符串对象中,在程序中能不能更改字符串,比如拼接新的字符串,可变的可以在原字符串中更改,

黑马程序员——OC学习笔记—— Copy

黑马程序员——OC学习笔记—— Copy ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- copy 即对象拷贝 要使用对象数据而不希望修改对象时,可以使用copy copy叫做浅拷贝  mutablecopy深拷贝 copy需要遵守NSCopying协议,实现CopywithZone方法 MutableCopy也一样要遵守相应协议 注意: OC中copy复制的对象都是不可变的  mutablecopy复制的是可变副本 浅拷贝:只拷贝地址,不

黑马程序员-OC学习笔记之autorelease与自动释放池

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.autorelease autorelease与release相似,是OC中的一个对象方法.这两个方法都能把对象的引用计数器减1,但是release是一个精确的减1,对对象的操作只能在release之前进行,如果是在之后,就会出现野指针错误:而autorelease是一个不精确的引用计数器减1,当给对象发送autorelease消息时,对象就会被放到自动

黑马程序员-C学习笔记之scanf

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.scanf函数介绍 这也是在stdio.h中声明的一个函数,因此使用前必须加入#include<stdio.h>.调用scanf函数时,需要传入变量的地址作为参数,scanf函数会等待标准输入设备(比如键盘)输入数据,并且将输入的数据赋值给地址对应的变量. 函数原型为:int scanf(const char*format,...); 二.scanf用

黑马程序员_OC学习笔记之description方法和sel

OC--description方法 1.Description方法包括类方法和对象方法.(NSObject类所包含) -description(对象方法) 2.使用NSLog和@%输出某个对象时,会调用对象的description方法,并拿到返回值进行输出. +description(类方法) 3.使用NSLog和@%输出某个对象时,会调用类对象的description方法,并拿到返回值进行输出,把整个对象一次性打印出来,打印对象使用%@. 4.使用@%打印对象如(“@%”,P)默认打印输出为<