15.5 词典对象

dictionary是由键-对象对组成的数据集合。正如在词典中查找单词的定义一样,可通过对象的键从Objective-C词典中获取所需的值(即那个对象)。词典中的键必须是单值的,尽管它们通常是字符串,但还可以是任何对象类型。和键关联的值可以是任何对象类型,但它们不能为nil。

词典可以是固定的,也可以是可变的。可变词典中记录可动态的添加和删除。可基于特定的键对词典进行搜索,也可以枚举它们的内容。代码清单15-14创建了一个可变词典,它用作Objective-C的术语表,前三条记录已添加到词典中。

要在程序中使用词典类,需将下面这行代码添加到程序中:


import<Foundation/NSDictionary.h>


代码清单15-14


import<Foundation/NSObject.h>

import<Foundation/NSString.h>

import<Foundation/NSDictionary.h>

import<Foundation/NSAutoreleasePool.h>

int main(int argc, char*argv[])

{

NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];

NSMutableDictionary*glossary=[NSMutableDictionary dictionary];

//Store three entries in the glossary

[glossary setObject:@“A class defined so other classes can inherit from it”

forKey:@“abstract class”];

[glossary setObject:@“To implement all the methods defined in a protocol”

forKey:@“adopt”];

[glossary setObject:@“Storing an object for later use”

forKey:@“archiving”];

//Retrieve and display them

NSLog(@“abstract class:%@”,[glossary objectForKey:@“abstract class”]);

NSLog(@“adopt:%@”,[glossary objectForKey:@“adopt”]);

NSLog(@“archiving:%@”,[glossary objectForKey:@“archiving”]);

[pool drain];

return 0;

}


代码清单15-14输出


abstract class:A class defined so other classes can inherit from it

adopt:To implement all the methods defined in a protocol

archiving:Storing an object for later use


表达式


[NSMutableDictionary dictionary]


创建了一个空的可变词典。随后使用setObject:forKey:方法将键-值对添加到词典中。生成词典之后,可以使用objectForKey:方法检索给定键的值。代码清单15-14显示了如何检索和显示Objective-C术语表中的三条记录。在更为实际的应用程序中,用户键入他要定义的单词,程序会搜索该术语表以寻找其定义。

枚举词典

代码清单15-15阐述了如何使用dictionaryWithObjectsAndKeys:方法和带有初始键-值对的词典,这样就创建了一个不可变词典,该程序还显示如何使用快速枚举循环一次一个键地从词典检索各个元素。不像数组对象,词典对象是无序的。所以,枚举词典时,放到词典中的第一个键-对象对并不一定是第一个提取的。

代码清单15-15


import<Foundation/NSObject.h>

import<Foundation/NSString.h>

import<Foundation/NSDictionary.h>

import<Foundation/NSAutoreleasePool.h>

int main(int argc, char*argv[])

{

NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];

NSDictionary*glossary=

[NSDictionary dictionaryWithObjectsAndKeys:

@“A class defined so other classes can inherit from it”,

@“abstract class”,

@“To implement all the methods defined in a protocol”,

@“adopt”,

@“Storing an object for later use”,

@“archiving”,

nil

];

//Print all key-value pairs from the dictionary

for(NSString*key in glossary)

NSLog(@“@%@”,key,[glossary objectForKey:key]);

[pool drain];

return 0;

}


代码清单15-15输出


abstract class:A class defined so other classes can inherit from it

adopt:To implement all the methods defined in a protocol

archiving:Storing an object for later use


dictionaryWithObjectsAndKeys:的参数是object-key对的列表(是的,就是这种顺序),每个object-key用逗号隔开。列表必须以特定的nil对象结束。

程序创建词典后,它设置一组循环语句用于检索词典的内容。已经说过,键是从词典中依次被检索的,而没有特定顺序。如果要以字母顺序显示词典中的内容,可以先检索词典中的所有键,将其排序,然后为所有已排序键检索对应的值。keysSortedByValueUsingSelector:方法可以帮你完成一半工作,它可以依据你的排序标准返回已排序的键。

我们已经显示了词典的一些基本操作。表15-6和表15-7分别总结出使用不变和可变词典的一些常用方法。因为NSMutableDictionary类是NSDictionary类的子类,所以它继承了NSDictionary类的方法。

表15-6和表15-7中的key、key1、key2、obj、obj1和obj2是任意对象,size是一个NSUInteger整数。

15.5 词典对象 - 图1

15.5 词典对象 - 图2