NSDictionary的功能与用法
NSDictionary分别提供了类方法和实例方法来创建NSDictionary,类方法以dictionary开头,实例方法则以init开头,下面是创建NSDictionary对象的几类常见的方法:
🎇dictionary:创建一个不包含任何key-value对的NSDictionary。
🎇dictionaryWithContentsOfFile:/initWithContentsOfFile::读取指定文件的内容,使用指定的文件内容来初始化NSDictionary。该文件通常是由NSDictionary输出生成的。
🎇dictionaryWithDictionary:/initWithDictionary::使用已有的NSDictionary包含的key-value对来初始化NSDictionary对象。
🎇dictionaryWithObject:forKey::使用单个key-value对来创建NSDictionary对像。
🎇dictionaryWithObjects:forKeys:/initWithObjects:forKeys::使用两个NSArray分别指定key、value集合,可以创建包含多个key-value对的NSDictionary。
🎇dictionaryWithObjectsAndKeys:/initWithObjectsAndKeys::调用该方法时,需要按value1,key1,value2,key2,…,nil的格式传入多个key-value对。
一旦得到NSDictionary,接下来就可以通过方法来访问该集合所包含的key或value,NSDictionary提供了如下常用的方法:
🎇count:返回所有key-value对数量。
🎇allKeys:返回全部key。
🎇allKeysForObject::返回指定value对应的全部key。
🎇allValues:返回包含的全部value。
🎇objectForKey::获取指定key对应value。
🎇objectForKeyedSubscript::通过该方法的支持,允许通过下标法来获取指定key对应的value。
🎇valueForKey::获取指定key对应的value。
🎇keyEnumerator:返回用于遍历该NSDictionary所有key的NSEnumerator对象。
🎇objectEnumerator:该方法返回用于遍历该NSDictionary所有value的NSEnumerator对象。
🎇enumerateKeysAndObjectsUsingBlock::使用指定的代码块来迭代执行该集合中所有的key-value对。
🎇enumerateKeysAndObjectsWithOptions:usingBlock::使用指定的代码块来迭代执行该集合中所有的🎇key-value对。该方法可以传入一个额外的NSEnumerationOptions参数。
🎇writeToFile:atomically::将该NSDictionary对象的数据写入指定文件。
以下代码是对创建字典几种方法的演示:
#import "NSDictionary.h"
int main() {
@autoreleasepool {
NSDictionary * a = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2", nil];
//利用实例方法创建字典
NSLog(@"%@",a);
NSDictionary * b = @{@"key1":@"value1",@"key2":@"value2"};
//字面量方法创建字典
NSLog(@"%@",b);
NSDictionary * c = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil];
//利用类方法创建字典
NSLog(@"%@",c);
NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil];
NSDictionary * dict1 = [[NSDictionary alloc] initWithDictionary:dict];
//通过字典实例方法进行初始化
NSDictionary * dict2 = [NSDictionary dictionaryWithDictionary:dict];
//通过字典类方法进行初始化
NSLog(@"%@",dict1);
NSLog(@"%@",dict2);
}
}
输出结果:
然后是字典的基本操作代码:
NSDictionary * dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil];
NSString * value1 = [dict objectForKey:@"key1"];
NSString * value2 = dict[@"key2"];
NSLog(@"value1=%@,value2=%@",value1,value2);
//根据key值获取相应值
NSArray * array = [dict allKeys];
NSLog(@"获取所有的key值为:%@",array);
//获取字典中所有的key
NSArray * array2 = [dict allValues];
NSLog(@"获取所有的value值为:%@",array2);
//获取字典中所有的value
输出结果:
对NSDictionary的key排序
和对数组排序一样,三种方法:
🎇keysSortedByValueUsingSelector::根据所有value指定方法的返回值对key排序;调用该方法必须返回NSOrderedAscending、NSOrderedDescending、NSOrderedSame这三个枚举值之一。
🎇keysSortedByValueUsingComparator::使用指定的代码块来遍历key-value对,并根据执行结果(必须返回NSOrderedAscending、NSOrderedDescending、NSOrderedSame这三个枚举值之一)对所有key进行排序。
🎇keysSortedByValueWithOptions:usingComparator::与前一个方法的功能类似,只是可以传入一个额外的NSEnumerationOptions参数。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
//
NSDictionary* dict = @{@"key1": @"ccc",
@"key2":@"bbbb",
@"key3":@"aa",
@"key4":@"d"
};
//获取所有直接调用value的compare:方法对所有key进行排序
//返回排序好的所有key组成的NSArray
NSArray* keyArr1 = [dict keysSortedByValueUsingSelector:@selector(compare:)];
NSLog(@"%@", keyArr1);
NSArray* keyArr2 = [dict keysSortedByValueUsingComparator:
//对value进行比较,字符串越长,即可认为value越大
^(id value1, id value2){
//下面定义比较大小的标准:字符串越长,即可认为value越大
if([value1 length] > [value2 length]) {
return NSOrderedDescending;
} else if ([value1 length] < [value2 length]) {
return NSOrderedAscending;
} else {
return NSOrderedSame;
}
}];
NSLog(@"%@", keyArr2);
}
}
输出结果:
NSMutableDictionary的功能与用法
NSMutableDictionary继承了NSDictionary,它代表一个key-value对可变的NSDictionary集合。由于NSMutableDictionary可以动态地添加key-value对,因此,创建NSMutableDictionary集合时可以指定初始容量。
NSMutableDictionary主要新增了如下方法:
🎇setObject:forKey::设置一个key-value对。如果NSDictionary中没有包含与该key相同的key-value对,那么NSDictionary将会新增一个key-value对;否则该key-value对将覆盖已有的key-value对。
🎇setObject:forKeyedSubscript::通过该方法的支持,允许程序通过下标法来设置key-value对。
addEntriesFromDictionary::将另一个NSDictionary中所有的key-value对复制到当前NSDictionary中。
🎇setDictionary::用另一个NSDictionary中所有的key-value对替换当前NSDictionary中的key-value对。
🎇removeObjectForKey::根据key来删除key-value对。
🎇removeAllObjects:清空该NSDictionary。
🎇removeObjectsForKeys::使用多个key组成的NSArray作为参数,同时删除多个key对应的key-value对。
我们先按照最先对普通字典的理解对可变字典初始化。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableDictionary * a= [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value3",@"key3", nil];
//通过类方法初始化
NSMutableDictionary * b = [NSMutableDictionary dictionaryWithDictionary:a];
//通过字典的类方法初始化
NSMutableDictionary * c = @{@"key1":@"value1",@"key2":@"value2",@"key3":@"value3"};
//通过字面量方法初始化
NSMutableDictionary * d = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2", nil];
//通过实例方法初始化
NSMutableDictionary * e = [[NSDictionary alloc] initWithDictionary:a];
//通过字典的实例方法初始化
NSLog(@"%@",a);
NSLog(@"%@",b);
NSLog(@"%@",c);
NSLog(@"%@",d);
NSLog(@"%@",e);
}
}
输出结果:
我们可以看出来貌似是没有问题的。
然后我们挑一些可变字典新增的方法来看看。
为了看起来比较明显,我们对原来五个字典的值作以改变。
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableDictionary * a= [NSMutableDictionary dictionaryWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", @"value3", @"key3", @"value5", @"key5", nil];
//通过类方法初始化
NSMutableDictionary * b = [NSMutableDictionary dictionaryWithDictionary:a];
//通过字典的类方法初始化
NSMutableDictionary * c = @{@"key1":@"value1",@"key2":@"value2",@"key3":@"value3"};
//通过字面量方法初始化
NSMutableDictionary * d = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"value1",@"key1",@"value2",@"key2",@"value4",@"key4", nil];
//通过实例方法初始化
NSMutableDictionary * e = [[NSMutableDictionary alloc] initWithDictionary:a];
//通过字典的实例方法初始化
/*NSLog(@"%@",a);
NSLog(@"%@",b);
NSLog(@"%@",c);
NSLog(@"%@",d);
NSLog(@"%@",e);*/
[d addEntriesFromDictionary:a];
NSLog(@"%@",a);
}
}
输出结果:
没有问题,然后我们再来试一下c这个字典。
[c addEntriesFromDictionary: d];
NSLog(@"%@",c);
我们发现程序在编译时没错,运行时出错了。
因此可以得知可变字典是不能通过字面量创建的,这个问题同样存在于字符串和数组里,在之前的学习中有所疏忽。