Objective-C之NSDictionary学习笔记(IOS 9.1)


NSDictionary类简介

 1. 以key-object的形式保存数据,是一个集合类(collection)
 2. 词典中词条的保存是无序的
 3. 不可变词典(内容一旦init后就不能更改)
 4. 既然不能更改,当然就不能进行删除、替换、增加操作,只能查询
 5. key值不能重复

属性表(@property)

@property 描述
@property(readonly) NSUInteger count 词典词条的数量
@property(readonly, copy) NSArray < KeyType > *allKeys 词典的所有键值(数组)
@property(readonly, copy) NSArray < ObjectType > *allValues 词典的所有词条(数组)
@property(readonly, copy) NSString *description 描述词典内容的字符串(plist格式)
@property(readonly, copy) NSString *descriptionInStringsFileFormat 描述.string格式文件的词典内容的字符串

常用方法

常用类方法

词典对象的生成

+ (instancetype)dictionary // 生成并返回一个空的词典对象
+ (instancetype)dictionaryWithObject:(ObjectType)anObject forKey:(id<NSCopying>)aKey // 根据akey和anObject返回一个词典对象 

常用实例方法

词典对象的初始化

- (instancetype)initWithObjects:(NSArray<ObjectType>
*)objects forKeys:(NSArray<id<NSCopying>> *)keys //分别从objects和keys数组中取出一个元素作为 key - object 键值对,并返回包含该键值对的词典对象

便利构造器:dictionaryWithObjects : forKeys :


- (instancetype)initWithObjects:(const ObjectType _Nonnull
[])objects forKeys:(const id<NSCopying> _Nonnull [])keys
count:(NSUInteger)count //用objects和keys数组的元素来生成count条词条的词典对象

便利构造器:dictionaryWithObjects : forKeys : count :


- (instancetype)initWithObjectsAndKeys:(id)firstObject, ... //使用指定的object - key来创建词典对象,以nil作为结束

便利构造器:dictionaryWithObjectsAndKeys :


- (instancetype)initWithDictionary:
(NSDictionary<KeyType,ObjectType> *)otherDictionary //用一个已经存在的词典对象创建一个词典对象(注:此处的otherDictionary可以是可变词典对象)

便利构造器:dictionaryWithDictionary :


词典对象的访问

- (NSUInteger) count //返回词条数量
- (ObjectType)objectForKey:(KeyType)aKey //返回akey对应的值,若不存在则返回nil
- (NSArray <KeyType> *)allKeys //返回词典中所有对象的key
- (NSArray <KeyType> *)allValues //返回词典中所有的值对象
- (NSEnumerator<ObjectType> *)keyEnumerator //返回一个可以快速访问词典中所有关键字的 快速枚举器
- (NSEnumerator<ObjectType> *)objectEnumerator //返回一个可以快速访问词典中所有值对象的 快速枚举器
- (NSArray<KeyType> *)allKeysForObject:(ObjectType)anObject //返回词典中所有值对象为anObject的key数组

词典对象的比较

- (BOOL)isEqualToDictionary:
(NSDictionary<KeyType,ObjectType> *)otherDictionary //如果两个词典的词条数和key - object都是一样就返回YES

词典对象,文件输入与输出

- (NSString *)description //以ASCII编码的属性列表格式输出词典的词条

- (NSDictionary<KeyType,ObjectType>*)initWithContentsOfFile:(NSString *)path //根据属性列表格式保存的文件来初始化词典对象

便利构造器:dictionaryWithContentsOfFile:


- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)flag //把代表这个词典内容的属性列表输出到指定的文件(flag是控制写入的,如果为YES则表示完全写入)

参考方法:writeToFile: atomically: encoding: error:


词典对象的遍历

for (... in ...) {
   ...
}
- (void)enumerateKeysAndObjectsUsingBlock:(void (^)(KeyType
key, ObjectType obj, BOOL *stop))block 

词典对象,小试牛刀

//Xcode 7.2
#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        //1.词典对象的生成
        NSDictionary *dict = [NSDictionary dictionary]; //返回空的词典对象
        NSLog(@"dict --> %@",[dict description]);    //打印对象的内容,返回一个字符串“{ 内容在这 }”
        //1.1 返回一个以dict - dict1(key - object)的词典对象
        NSDictionary *dict1 = [NSDictionary dictionaryWithObject:@"dict1" forKey:@"dict"];
        NSLog(@"dict1 --> %@",[dict1 description]);
        //1.2 返回一个以dict - 1(key - object)的词典对象 (@1,是指NSValue 1)
        NSDictionary *dict1_1 = [NSDictionary dictionaryWithObject:@1 forKey:@"dict"];
        NSLog(@"dict1_1 --> %@",[dict1_1 description]);
        
        //2.词典对象的初始化
        //2.1 返回一个以@[@"-1-",@"-2-",@"-3-"] - @[@1,@2,@3]为基础逐一创建的,“-1-” - 1,“-2-” - 2,“-3-” - 3共三条词条的词典对象
        NSDictionary *dict2 = [[NSDictionary alloc] initWithObjects:@[@1,@2,@3] forKeys:@[@"-1-",@"-2-",@"-3-"]];
        NSLog(@"dict2 --> %@",[dict2 description]);
        //2.2 IOS 8可以用,但IOS 9才行被搞死了 T_T
//        __unsafe_unretained NSArray * _Nonnull arryObjects = @[@"one",@"two",@"三"];
//        __unsafe_unretained NSArray * _Nonnull arrayKeys = @[@1,@2,@3];
//        NSDictionary *dict2_1 = [[NSDictionary alloc] initWithObjects:arryObjects forKeys:arrayKeys count:4];
//        NSLog(@"dict2_1 --> %@",[dict2_1 description]);
        //报错信息:Implicit conversion of an Objective-C pointer to 'const id  _Nonnull __unsafe_unretained *' is disallowed with ARC
        //2.3
        NSDictionary *dict2_2 = [[NSDictionary alloc] initWithObjectsAndKeys:@"object1", @"key1", @"object2", @"key2", nil];
        NSLog(@"dict2_2 --> %@",[dict2_2 description]);
        //2.4
        NSDictionary *dict2_3 = [[NSDictionary alloc] initWithDictionary:dict2_2];
        NSLog(@"dict2_3 --> %@",[dict2_3 description]);
        
        //3.词典对象的访问
        NSDictionary *dict3 = @{@1 : @"one", @2 : @"two", @3 : @[@"three",@"four"], @4 : @"one"};
        //3.1 词条的数量
        NSLog(@"dict3 --> %@,词条数:%lu",[dict3 description], [dict3 count]);
        //3.2 根据 key 寻找 object
        NSLog(@"dict3 --> %@", [dict3 objectForKey:@2]);
        NSLog(@"dict3 --> %@", [dict3 objectForKey:@3]);
        //3.3 返回包含所有key的数组
        NSArray *arryAllKeys = [dict3 allKeys];
        for (NSNumber *key in arryAllKeys) {
            NSLog(@"Allkeys --> %@", [key description]);
        }
        //3.4 返回一个枚举器
        NSEnumerator * enumer = [dict3 keyEnumerator];
        for (NSNumber *key in enumer) {
            NSLog(@"enumerkeys --> %@", [key description]);
        }
        //3.5 返回一个包含@“one”的所有关键字的数组
        NSArray *arryOneKeys = [dict3 allKeysForObject:@"one"];
        for (NSNumber *key in arryOneKeys) {
            NSLog(@"onekeys --> %@", [key description]);
        }
        
        //4.词典对象的比较
        NSDictionary *dict4_1 = @{@1 : @"one", @2 : @"two", @3 : @"three"};
        NSDictionary *dict4_2 = @{@1 : @"one", @2 : @"two", @3 : @"three"};
        NSDictionary *dict4_3 = @{@1 : @"one", @2 : @"two"};
        NSDictionary *dict4_4 = @{@1 : @"一", @2 : @"二", @3 : @"三"};
        //只有key和object完全一样才会返回YES
        [dict4_1 isEqualToDictionary:dict4_2] ? NSLog(@"dict4_1 & dict4_2: YES"): NSLog(@"dict4_1 & dict4_2: NO");
        [dict4_1 isEqualToDictionary:dict4_3] ? NSLog(@"dict4_1 & dict4_3: YES"): NSLog(@"dict4_1 & dict4_3: NO");
        [dict4_3 isEqualToDictionary:dict4_4] ? NSLog(@"dict4_3 & dict4_4: YES"): NSLog(@"dict4_3 & dict4_4: NO");
        
        //5.词典对象与文件操作
        //5.1 根据plist文件来创建词典
        NSDictionary *dict5 = [[NSDictionary alloc] initWithContentsOfFile:@"/Users/windy/Desktop/OC pros/NSDictionaryTest/dict.plist"];
        NSLog(@"dict5 --> %@", [dict5 description]);
        //5.2 把词典词条写进文件
        NSDictionary *dict5_1 = @{@"一" : @[@"one",@"one one"], @"二" : @3};
        [dict5_1 writeToFile:@"/Users/windy/Desktop/OC pros/NSDictionaryTest/dict2.plist" atomically:YES];
        //5.3 把词典词条读取出来,使用的是initWithContentsOfFile:的便利构造器dictionaryWithContentsOfFile:
        NSDictionary *dict5_2 = [[NSDictionary alloc] init];
        dict5_2 = [NSDictionary dictionaryWithContentsOfFile:@"/Users/windy/Desktop/OC pros/NSDictionaryTest/dict2.plist"];
        NSLog(@"dict5_2 --> %@", [dict5_2 description]);
        
        //6.利用block遍历词典
        NSDictionary *dict6 = @{@"china" : @"中国", @"Eng" : @"英国"};
        [dict6 enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
            NSLog(@"dict6 --> key - obj: %@ = %@", key, obj);
        }];
    }
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容