目录

Objective-C_16.Foundation框架—集合

一、NSArray和NSMutableArray

(一)NSArray不可变数组

(1)NSArray的基本介绍

NSArray是OC中使用的数组,是面向对象的,以面向对象的形式操纵对象,是不可变数组。

C语言数组有一个缺点即数组中只能存放同种数据类型的元素。

OC数组只能存放OC对象,不能存放非OC对象,如int,结构体和枚举等。

(2)NSArray的创建
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
// 普通数组的创建
int a = 5;
int ages[10] = {1, 2, 3, 4};

// 创建一个Person对象的数组
Person *p = [[Person alloc] init];
Person *persons[5] = {p, [[Person alloc] init]};

// NSArray 的创建
NSArray *array = [NSArray array];
// 0. 这个array永远是个空数组

NSArray *array2 = [NSArray arrayWithObject:@"ehe"];
// 1. 这个数组只有一个元素,且永远只有一个元素

// nil 是数组元素结束的标记
NSArray *array3 = [NSArray arrayWithObjects:@"xiaoming", @"xiaohong", nil];
// 2. 这个数组中有多个元素,以nil结尾

// 3.快速创建一个NSArray对象
NSArray *array4 = @[@"jack", @"rose", @"134234"];
(3)NSArray的访问
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 获取 NSArray 的元素个数
// 使用 count 方法

[array2 count];
NSLog(@"%ld", array2.count);

// NSArray中元素的访问
// 1. 使用索引
NSLog(@"%@", [array2 objectAtIndex:0]);
// 2. 像c语言数组一样使用下标
NSLog(@"%@", array2[0]);


 (4)NSArray的遍历

数组的遍历有以下几种方式:

首先创建一个数组

1
2
Person *p = [[Person alloc] init];
NSArray *array = @[p, @"heh", @"jack"];

第一种方法:使用for循环遍历

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 2. 快速便利
// id obj 代表着数组中的每个元素
int i = 0;
for (id obj in array)
{
    // 找出 obj 元素中在数组中的位置
    NSUInteger i = [array indexOfObject:obj];
    NSLog(@"%ld - %@", i,obj);

    // 结束便利
    if (i == 1)
    {
        break;
    }
}

// 3. 使用block遍历
// 每遍历到一个元素,就会调用一次block
// 并且当前元素和索引位置当做参数传给block
[array enumerateObjectsUsingBlock:
 ^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
{
    NSLog(@"%ld - %@", idx, obj);

    if (idx == 0)
    {
        // 停止遍历
        *stop = YES;
    }
}];

Block遍历的深入研究:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  
/// 现在此方法会报错了
void ^(myBlock)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *stop)
{
    NSLog(@"%ld - %@", idx, obj);

    if (idx == 0)
    {
        // 停止遍历
        *stop = YES;
    }
};

for (int i = 0; i < array.count; i++)
{
    // 用来标记是否需要停止遍历
    BOOL isStop = NO;
    // 取出元素
    id obj = array[i];
    myBlock(obj, i, &isStop);

    if (isStop)
    {
        break;
    }

}

每拿到一个元素,就传递给obj,就会调用一次block,并且把当前的元素和索引位置当做参数传递给block。

注意1:break只使用在两种场合,即switch和循环结构中。

注意2:stop参数用来停止遍历,其值若为YES,则停止。

(二)NSMutableArray可变数组

(1)NSMutableArray的基本使用

注意:NSMutableArray 继承自 NSArray,几乎拥有 NSArray 的一切方法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 创建一个可变数组
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"xiaoming", nil];

// 添加元素
// 添加一个 Person 类对象元素
[array addObject:[[Person alloc] init]];
// 添加一个字符串对象元素
[array addObject:@"xiaoming"];
// 错误写法
// oc数组中得元素不能为空值
//    [array addObject:nil];

// 删除元素
// 删除所有的元素
[array removeAllObjects];
// 删除指定的对象
[array removeObject:@"xiaoming"];
//删除指定索引的元素
[array removeObjectAtIndex:0];

// 打印数组

NSLog(@"%@", array);
NSLog(@"%ld", array.count);

二、NSSet和NSMutableSet

(一)NSSet不可变集合

基本使用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// 创建一个NSSet
NSSet *s = [NSSet set];
// 因为不可变,所以 s 永远都为空

// 创建一个有多个元素的 NSSet
NSSet *s2 = [NSSet setWithObjects:@"xiaoming",@"haha", nil];

// 随机取出一个元素
NSString *str = [s2 anyObject];

// 打印
NSLog(@"%@", str);

// 打印结果
2016-07-31 01:02:20.904 test[3904:1421519] xiaoming

(二)NSMutableSet可变集合

基本使用:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 创建一个 NSMutableSet
NSMutableSet *s = [NSMutableSet set];

// 添加元素
[s addObject:@"xiaoming"];

// 删除元素
// 删除指定元素
[s removeObject:(nonnull id)];
// 删除所有元素
[s removeAllObjects];

(三)NSSet和NSArray的对比

(1)共同点:
  1. 都是集合,都能够存放多个对象

  2. 只能存放oc对象,不能存放非oc对象类型(如int等基本数据类型和结构体,枚举等)。

  3. 本身都不可变,都有一个可变的子类。

(2)不同点:

NSArray 有顺序,NSSet 没有顺序

三、NSDictionary 和 NSMutableDictionary

(一)NSDictionary 不可变字典

(1)介绍

现实中的字典:根据索引找到具体的内容

OC 中的 NSDictionary:根据 key 找到 value。里面存储的东西都是键值对。

(2)NSDictionary的创建
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// 创建字典
// 第一种方式
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];

// 第二种方式
NSArray *keys = @[@"name", @"address"];
NSArray *objects = @[@"yangeyong", @"南昌"];
NSDictionary *dict1 = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

// 第三种方式
NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:
                      @"xiaoming", @"name",
                      @"北京", @"Address",
                      @"1348494949", @"qq",
                      nil];

// 第三种方式,快速创建
NSDictionary *dic2 = @{@"name" : @"xiaoming",
                       @"address" : @"北京"};

注意:快速创建字典是编译器特性。

(3)NSDictionary的访问
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// 基本使用
// 根据 key 获取对应的值
id obj = [dict objectForKey:@"name"];
// 快速访问
id obj1 = dict[@"name"];

// 打印
NSLog(@"%@", obj);
// 返回的是键值对的个数
// count 方法获取当前字典中键值对的个数
NSLog(@"%ld", dict.count);
(4)NSDictionary的遍历
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// 字典不允许有相同的 key ,但允许有相同的 value (object)
// 字典是无序的
// 快速创建一个字典
NSDictionary *dict = @
{
    @"adress" : @"北京",
    @"name" : @"jack",
    @"name2" : @"xiaoming"
};

// 字典的便利
// 第一种方式,使用for循环
NSArray *keys = [dict allKeys];
[keys enumerateObjectsUsingBlock:^
(NSString *key, NSUInteger idx, BOOL * _Nonnull stop)
{
    NSString *object = dict[key];

    NSLog(@"%@, %@", key, object);
}];

// 第二种方式,使用block
[dict enumerateKeysAndObjectsUsingBlock:^
(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop)
{
    NSLog(@"%@ - %@", key, obj);
}];

(二)NSMutableDictionary可变字典

(1)NSMutableDictionary的基本使用
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// 可变字典的基本使用
// 创建一个空的可变字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];

// 添加键值对
[dict setObject:@"xiaoming" forKey:@"name"];
[dict setObject:@"北京" forKey:@"address"];
[dict setObject:@"rese" forKey:@"name"];

// 删除键值对
// 删除特定键值对
[dict removeObjectForKey:(nonnull id)];
// 删除所有得键值对
[dict removeAllObjects];

// 获取 namekey 对应的值
NSString *str = dict[@"name"];

// 打印数组
NSLog(@"%@", @[@"XIAOMING", @"ROSE"]);
// 打印字典
NSLog(@"%@", dict);

// 打印结果

2016-07-31 01:33:36.466 test[4260:1513182] (
    XIAOMING,
    ROSE
)
2016-07-31 01:33:36.466 test[4260:1513182] {
}

(2)NSMutableDictionary的使用注意
1
2
3
// 字典的使用注意
NSMutableDictionary *dict = @{@"name" : @"j"};  //这样会报警
[dict setObject:@"xiaoming" forKey:@"name"];

注意:这种快速创建的方式只适用于不可变字典。