您的位置:首页 > 其它

OC学习笔记之Foundatio框架集合类

2014-05-18 12:46 423 查看
一、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]);<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 那么遍历将停止。



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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: