一、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数组的訪问非常easy。a[i]    这就是訪问数组a的第 i  个元素,OC数组中訪问指定元素例如以下:

        // 訪问数组元素
NSLog(@"第%d个元素为%@", 0, [array3 objectAtIndex:0]);
   苹果官方为和简化。又提供了Xcode的新特性,OC数组的訪问变得简单。能够和C数组有一样的写法:

NSLog(@"第%d个元素为%@", 1 , array3[1]);<span style="font-family: Menlo; line-height: 1.6;"> </span>

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

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 那么遍历将停止。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvd2FuZ3FpbnFpYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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

版权声明:本文博客原创文章。博客,未经同意,不得转载。

OC本学习笔记Foundatio框架集的更多相关文章

  1. OC本学习笔记Foundation框架NSString与NSMutableString

       一.NSString与NSMutableString         相信大家对NSString类都不陌生.它是OC中提供的字符串类.它的对象中的字符串都是不可变的,而它的子类NSMutable ...

  2. Redis学习笔记八:集群模式

    作者:Grey 原文地址:Redis学习笔记八:集群模式 前面提到的Redis学习笔记七:主从复制和哨兵只能解决Redis的单点压力大和单点故障问题,接下来要讲的Redis Cluster模式,主要是 ...

  3. ZooKeeper学习笔记一:集群搭建

    作者:Grey 原文地址:ZooKeeper学习笔记一:集群搭建 说明 单机版的zk安装和运行参考:https://zookeeper.apache.org/doc/r3.6.3/zookeeperS ...

  4. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  5. 前端学习 -- Html&Css -- 框架集

    框架集和内联框架的作用类似,都是用于在一个页面中引入其他的外部的页面,框架集可以同时引入多个页面,而内联框架只能引入一个,在h5标准中,推荐使用框架集,而不使用内联框架. 使用frameset来创建一 ...

  6. IOS开发学习笔记016-Foundation框架

     Foundation 框架的学习 一.Foundation 常用结构体 1.NSRange(location,length)  typedef struct _NSRange { NSUIntege ...

  7. Hadoop学习笔记—13.分布式集群中节点的动态添加与下架

    开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如何动态(不关机且正在运行的情况下)地添加一个Hadoop节点与 ...

  8. [ 学习笔记 ] Hibernate框架学习之一

    一.JavaEE开发三层结构和三大框架的对应关系: Struts2框架 -> 表现层 web层(MVC是表现层的设计模型) 业务层 service层 Hibernate框架 -> 持久层 ...

  9. 吴裕雄--天生自然HADOOP学习笔记:hadoop集群实现PageRank算法实验报告

    实验课程名称:大数据处理技术 实验项目名称:hadoop集群实现PageRank算法 实验类型:综合性 实验日期:2018年 6 月4日-6月14日 学生姓名 吴裕雄 学号 15210120331 班 ...

随机推荐

  1. 日版 Galaxy Note sc05d 涮机

    问题描写叙述:手机已坏.进不了系统 以下提供线涮刷机教程: 1.首先拔掉你的sd卡和sim卡.双清你的手机.可能有些版本号的机油没有双清模式,那就进到设置里边恢复出厂设置,然后关掉你的手机再开机.等到 ...

  2. javaEE jdbc编程步骤

    1.载入数据库驱动(jar文件) //须要下载一个数据库的jar包,并导入对应的JDBC项目中,创建路径! Class.forName("com.mysql.jdbc.Driver" ...

  3. leetcode第一刷_Pow(x, n)

    高速乘方的算法,写了好多变,出了各种错,真是服了我自己了. 思想是每次对n减半,将当前的temp平方.须要注意的是假设当前的n是个奇数,减半之后会丢失掉一次乘积,因此假设当前的n为奇数,应该先在结果里 ...

  4. 编辑简单的 shell程序

    编辑简单的 shell程序 知道了vi编辑器的使用规则之后,结合shell的使用规则,可以编辑简单的 shell程序试试手 题目如下: 1.用while语句创建一个根据输入的数值求累加和(1+2+3+ ...

  5. dij算法为什么不能处理负权,以及dij算法变种

    对于上面那张图,是可以用dij算法求解出正确答案,但那只是巧合而已. 我们再看看下面这张图. dist[4] 是不会被正确计算的. 因为dij算法认为从队列出来的点,(假设为u)肯定是已经求出最短路的 ...

  6. Steps UVA 846

    说说:此题要求求出从整数x到达整数y所要经过的最短步数,且第一步和最后一步必须为一,同一时候每一步都比前一步多一步,少一步或一样.如果想搞清楚每一步详细是如何走的,那么这道题是相当麻烦的.考虑到前后两 ...

  7. 解决android3.0版本号以上应用接收不到开机广播问题

    如今是2014-07-16 下午15:27. 好久没写过东西,突然间灵感喷发想写点东西(事实上是刚刚弄好了一个棘手的问题,自豪中..呵呵呵呵 我牛掰).废话不多说,进入正题. 不知道你们又没有碰到这问 ...

  8. ubuntu中KDE与GNOME安装切换

    转载:http://apps.hi.baidu.com/share/detail/18919303 1.在Ubuntu中安装KDE桌面命令 sudo apt-get install kUbuntu-d ...

  9. 在mac os下编译android -相关文章

    1. Mac OS X下编译Android源码 http://blog.csdn.net/bulreed/article/details/22783467 2.MAC OS 编译 Android源代码 ...

  10. Oracle如何插入在特殊字符: &amp; 和 &#39; (各种解决方案)

    分类: Oracle Oracle中怎样插入特殊字符:& 和 ' (多种解决方式) 今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自己定义变量AMP赋值,一開始我非常 ...