OC--NSMutableDictionary可变字典

NSMutableDictionary,作为可变字典,其中的可变和可变字符串,可变数组是一样的。NSMutableDictionary是继承自NSDictionary的,所以上一篇文章中的一些属性和方法在这里都是适用的。下面来看看NSMutableDictionary的定义和初始化。

创建可变字典对象,定义并初始化:

定义NSMutableDictionary对象的类方法,numItems是字典中元素的个数。这个方法其实就是向内存申请了一定的内存空间。

+ (instancetype)dictionaryWithCapacity:(NSUInteger)numItems;

由于NSMutableDictionary是继承自NSDictionary的,NSDictionary是继承自NSObject的,所以适用alloc也可以创建一个可变字典对象,适用方法如下:

- (instancetype)initWithCapacity:(NSUInteger)numItemsNS_DESIGNATED_INITIALIZER;

NSMutableDictionary*dic1 = [[NSMutableDictionaryalloc]initWithCapacity:10];

       NSMutableDictionary*dic2 = [[NSMutableDictionaryalloc]init];

上面两中创建形式的区别在于第一个申请了10个元素的空间,第二个只是创建了一个对象。和数组一样,当我们不知道要申请多少空间的时候。我们可以个 dictionaryWithCapacity:方法或者initWithCapacity:方法传递0作为参数。

可变字典的初始化赋值,是使用NSDictionary的赋值方法。


可变字典常用操作方法

在字典后添加一个字典,也是字典后面拼接一个字典。

- (void)addEntriesFromDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;

删除字典中所有的元素

- (void)removeAllObjects;

根据key数组,删除对应的元素

- (void)removeObjectsForKeys:(NSArray<KeyType> *)keyArray;

根据key删除一个对应的元素

- (void)removeObjectForKey:(KeyType)aKey;

使用一个新的字典覆盖原来字典的数据

- (void)setDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;

使用key:value形式修改字典中key对应的元素值

- (void)setObject:(nullableObjectType)obj forKeyedSubscript:(KeyType <NSCopying>)keyNS_AVAILABLE(10_8, 6_0);

代码示例:

        //创建字典对象,初始化

       NSDictionary*dic1 = [NSDictionarydictionaryWithObjectsAndKeys:

                             @"value1",@"key1",

                             @"value2",@"key2",

                             @"value3",@"key3",

                             @"value4",@"key4",

                             nil];

       //定义可变字符串对象

       NSMutableDictionary*dic = [NSMutableDictionarydictionaryWithDictionary:dic1];

       NSLog(@"初始的字典:%@", dic);

        

       NSDictionary*dic2 = [NSDictionarydictionaryWithObjectsAndKeys:

                             @"value5",@"key5",

                             @"value6",@"key6",

                             @"value7",@"key7",

                             @"value8",@"key8",

                             nil];

       //字典拼接

        [dicaddEntriesFromDictionary:dic2];

       NSLog(@"拼接后的字典:%@", dic);

        

       //修改key1对应的值

        [dicsetObject:@"aaa"forKeyedSubscript:@"key1"];

       NSLog(@"修改后的字典:%@", dic);

        

       NSDictionary*dic3 = [NSDictionarydictionaryWithObjectsAndKeys:

                             @"value11",@"key11",

                             @"value22",@"key22",

                             @"value33",@"key33",

                             @"value44",@"key44",

                             @"value55",@"key55",

                             @"value66",@"key66",

                             nil];

       //字典覆盖

        [dicsetDictionary:dic3];

       NSLog(@"覆盖后的字典:%@", dic);

        

       //删除一个元素

        [dicremoveObjectForKey:@"key11"];

       NSLog(@"删除key1后的字典:%@", dic);

        

       //根据数组删除多个元素

       NSArray*array = @[@"key33",@"key22"];

        [dicremoveObjectsForKeys:array];

       NSLog(@"删除key2key3后的字典:%@", dic);

        

       //删除所有字典元素

        [dicremoveAllObjects];

       NSLog(@"删除所有元素后的字典:%@", dic);

打印结果:

2017-03-24 13:31:08.708 OCdemo[3060:333844]初始的字典:{

    key1 = value1;

    key2 = value2;

    key3 = value3;

    key4 = value4;

}

2017-03-24 13:31:08.709 OCdemo[3060:333844]拼接后的字典:{

    key1 = value1;

    key2 = value2;

    key3 = value3;

    key4 = value4;

    key5 = value5;

    key6 = value6;

    key7 = value7;

    key8 = value8;

}

2017-03-24 13:31:08.709 OCdemo[3060:333844]修改后的字典:{

    key1 = aaa;

    key2 = value2;

    key3 = value3;

    key4 = value4;

    key5 = value5;

    key6 = value6;

    key7 = value7;

    key8 = value8;

}

2017-03-24 13:31:08.709 OCdemo[3060:333844]覆盖后的字典:{

    key11 = value11;

    key22 = value22;

    key33 = value33;

    key44 = value44;

    key55 = value55;

    key66 = value66;

}

2017-03-24 13:31:08.709 OCdemo[3060:333844]删除key1后的字典:{

    key22 = value22;

    key33 = value33;

    key44 = value44;

    key55 = value55;

    key66 = value66;

}

2017-03-24 13:31:08.710 OCdemo[3060:333844]删除key2key3后的字典:{

    key44 = value44;

    key55 = value55;

    key66 = value66;

}

2017-03-24 13:31:08.710 OCdemo[3060:333844]删除所有元素后的字典:{

}

Program ended with exit code: 0


这些就是字典的常用操作了,在实际的开发中,所能到的也就是这样的操作。

在我昨天写代码的时候,遇到一个关于字典数据转换赋值的问题。

读取字典数据的方法是objectForKey:方法,当我们需要读取字典中的数据,给其他变量赋值的时候,数据类型的对应关系一定要注意,特别是使用到BOOL这个类型的时候,即使字典中对应的类型也是BOOL类型,也要在读取后进行一次转换才可以赋值给变量,不然会发现所有的BOOL类型变量都是YES。



关于字符串、数组、字典的操作其实不多,但是在实际开发中的应用却很重要。因为在开发中就只有3部分:视图、数据、逻辑。对于数据的操作,其实就是对字符串、数组、字典、还有其他类型数据的操作,只是要加上操作处理逻辑。但是无论如何操作,都是使用这些最基础的操作方法进行的,这些基础的东西才是最重要的。以前总是不愿意去看这些基础的东西,在开发中,也总是想不起来这些基础的操作是什么,每次用到的时候都去baidu。耽误了时间也显得自己技术很差,特别是在面试的时候,当面试官问到一些处理的时候,既然都说不出操作方法名,真的很失败。。。。

这次回头来复习的目的就是要好好梳理这些最基础的东西,希望自己可以坚持下去,加油!


版权声明:本文为m0_37681833原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。