免费开源的iOS开发学习平台

OC字典:1-NSDictionary类

字典是由键-值(key-value)组成的数据集合,其中值value为对象。可以通过键key从字典中获取需要的value值。字典中的键key必须唯一,通常情况下,键key为字符串对象,主要用于注明存储对象的说明,但键key也可以是其他类型的对象。和键key关联的值value可以是任何对象类型,但不能是nil。

创建不可变字典

在Foundation框架中,提供了NSDictionary类,该类中定义了与字典操作相关的属性以及方法。NSDictionary类是不可变字典,即字典创建完成后,不能再新增/删除键值对。当我们需要创建一个不可变字典时,通常有如下几种方法。

  • 不可变字典快速创建方法,格式如下:
@{
key1:value, 
key2:value, 
...
};

例如我们创建一个NSDictionary类的对象,其中存储4个键值对,这4个键值对的key都使用字符串对象,用来说明键值的含义,而value中可以保存各种类型的对象,可以是NSString字符串对象,也可以是NSNumber数字对象。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //快速方式创建字典
        NSDictionary *dict = @{
                               @"website":@"www.99ios.com",
                               @"name":@"99学院",
                               @"business":@"iOS学习",
                               @"foundedYear":@2016
                               };
    }
    return 0;
}
  • 调用dictionaryWithObjectsAndKeys类方法,使用该方法创建字典时,注意顺序是:value, key,并且要以nil结尾。如下创建的字典中,包含了两对键值对,其键key分别为website以及name。
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //注意是:value,key的顺序
        NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
                               @"www.99ios.com",
                               @"website",
                               @"99学院",
                               @"name",
                               nil];
    }
    return 0;
}
  • 使用键数组和值数组创建字典。把字典中的key以及value,按照对应顺序,分别放在一个数组中,然后调用dictionaryWithObjects: forKeys:方法,创建字典。
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建多组键值对的字典
        NSArray *keys = @[@"website",@"name"];
        NSArray *values = @[@"www.99ios.com",@"99学院"];
        NSDictionary *dict = [NSDictionary dictionaryWithObjects:values forKeys:keys];
    }
    return 0;
}

注意:key通常为NSString类型,但也可以为其他类型,如下创建的字典中,键key为一个NSNumber类的对象,这在语法上是允许的,但实际开发中一般不这样使用。

//创建非NSString类型的key
NSDictionary *dict = @{
                        @2016:@"2016"
                       };

访问字典的键值

字典最常用的操作就是根据键key来获取对应的值value。通常情况下,有如下两种方式来取值。

  • 使用dict[key]的形式

  • 使用objectForKey方法

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSDictionary *dict = @{
                               @"website":@"www.99ios.com",
                               @"name":@"九九学院",
                               @"business":@"iOS学习",
                               @"foundedYear":@2016
                               };
        NSString *website = dict[@"website"];
        NSLog(@"字典中website对应的value: %@",website);
        NSString *name = [dict objectForKey:@"name"];
        NSLog(@"字典中name对应的value: %@",name);
    }
    return 0;
}

运行结果:

遍历字典中的键值对

在Objective-C中提供了forin循环,forin循环除了能够用于遍历数组中的对象之外,也可以用于遍历字典中的键值对。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //快速方式创建字典
        NSDictionary *dict = @{
                               @"website":@"www.99ios.com",
                               @"name":@"九九学院",
                               @"business":@"iOS学习",
                               @"foundedYear":@2016
                               };
        //枚举字典
        for (NSDictionary *key in dict) {
            NSLog(@"key:%@   value: %@",key, dict[key]);
        }
    }
    return 0;
}  

运行结果如下。通过打印的顺序我们可以验证,在字典中存储的键值对是无序存放的,这个是字典与数组这两个数据存储结构的重要区别。

其他操作

对于字典的操作,除了上面介绍的字典创建以及键值对的取值之外,还有如下几个在NSDictionary类中定义的属性或方法相对常用。

  • 获取字典中键值对的数量
@property (readonly) NSUInteger count;
  • 获取一个字典中所有的键key,返回一个数组
@property (readonly, copy) NSArray<KeyType> *allKeys;
  • 获取一个字典中所有的值value,返回一个数组
@property (readonly, copy) NSArray<ObjectType> *allValues;

示例代码

https://github.com/99ios/4.4.1