在Objective-C中,字典就是关键字及其定义(描述)的集合。Cocoa中的实现字典的类是NSDictionary,形式是在给定的关键字(通常是一个NSString)下存储一个数值(可以是任何类型的对象)。然后你就可以用这个关键字来查找相应的数值,通常称之为键值对。不同于数组,字典(也被称为散列表或关联数组)使用的是键查询的优化存储方式,存储形态是无序的,它可以立即找出要查询的数据,而不需要遍历整个数组进行查找。
1.NSDictionary
常用创建方式
// 创建了一个永远为空的字典
NSDictionary*dict1=[NSDictionarydictionary];
// 创建有一组键值对的字典 (常用)
NSDictionary*dict2=[NSDictionarydictionaryWithObject:@"jack"forKey:@"name"];
// 获得字典内的键值对的个数
NSLog(@"count = %lu",dict2.count);
NSLog(@"dict2 = %@",dict2);
// 创建多组键值对的字典 (常用)
NSArray*values=@[@"jack",@"male",@"19"];
NSArray*keys=@[@"name",@"sex",@"age"];
NSDictionary*dict3=[NSDictionarydictionaryWithObjects:values forKeys:keys];
NSLog(@"dict3 = %@",dict3);
// 创建多组键值对的字典 (不建议使用)
NSDictionary*dict4=[NSDictionarydictionaryWithObjectsAndKeys:
@"jack",@"name",@"male",@"sex",@"19",@"age",
nil];// 这个方法不建议使用,因为值和键对应关系不好辨识
NSLog(@"dict4 = %@",dict4);
// 快速创建字典 (常用)
// 快速创建是编译器特性的语法,在编译器看到@{}语法时,会自动展开成dict3的方法
NSDictionary*dict5=@{@"name":@"jack",
@"sex":@"male",
@"age":@"19"};
NSLog(@"dict5 = %@",dict5);
// 根据已有字典创建新字典
NSDictionary*dict6=[NSDictionarydictionaryWithDictionary:dict5];
NSLog(@"dict6 = %@",dict6);
一般来说,类方法初始化都会有相应的实例方法与之对应。
常用方法
// 字典中不允许出现同名的key(只有其中一个会被添加成功), 但是可以出现相同的value, key的类型可以不是NSString型
NSDictionary*dict=@{
@"name":@"jack",
@"sex":@"man",
@"name2":@"jack",
@10:@20,
};
NSLog(@"count = %lu",dict.count);
NSLog(@"dict = %@",dict);
// 查看键对应的值 (参数类型为任何OC对象)
NSNumber*num=[dict objectForKey:@10];
NSLog(@"num = %@",num);
// 查看键对应的值(参数类型必须是NSString)
NSLog(@"sex = %@",[dict valueForKey:@"sex"]);
// 快速访问键值对
NSLog(@"快速访问:%@",dict[@"name"]);// 编译器特性的语法,编译器在看到这种语法时,会自动展开为objectForKey:方法
// 获取所有value为@"jack"的key
NSLog(@"all keys which value == jack :%@",[dict allKeysForObject:@"jack"]);
// 获取字典中所有的键的集合
NSLog(@"allkeys: %@",dict.allKeys);
// 获取字典中所有的值的集合
NSLog(@"allvalues: %@",dict.allValues);
// 获得字典的内容(描述)
NSLog(@"description: %@",dict.description);