Dictionaries 字典

NSString 类让我们可以使用字符串。NSArray 类可以让我们使用数组,我想你应该也能猜到,NSDictionary 让我们能够使用字典。字典有新旧两种语法,但我还是希望你不要新旧语法混用。

注意了,和 Swift 里的字典不一样,Objective-C 里的字典是无序的。你可以遍历字典里的元素,但可能它并不是按照你想要的顺序来遍历的。

我们可以用 "@{…}" 这个格式来创建字典。要注意的是,在每一个字典元素后面,你都要加上逗号。在整个字典后面,需要加上分号。而在值和关键字之间要加上冒号,下面是一个创建字典的例子。

NSDictionary *ships = @{
    @"Serenity": @"Firefly",
    @"Enterprise": @"Star Trek",
    @"Executor": @"Star Wars"
};

元素后面不一定要换行,但这样会让你的代码可读性更强。这里真的用了很多很多的 @ 符号,但是没有办法呀(>_<)

你还可以用 dictionaryWithObjectsAndKeys 方法来创建字典。dictionaryWithObjectsAndKeys 方法的写法和 Swift 里刚好相反,先写值,再写关键字。哪怕撇开这一点,这个写法的可读性还是很差,因为你不管是在每一组还是每一个关键字和值之间,都有逗号。

你也要在整个字典的结尾加上 nil,这一点和数组是一样的。如果你接手了一个项目,里有人用这种方法创造了字典,那你读起来就要小心了。比如下面这个例子:

NSDictionary *ships = [NSDictionary
dictionaryWithObjectsAndKeys:@"Serenity", @"Firefly", @"Enterprise",@"Star Trek", @"Executor", @"Star Wars", nil];

在这里换行就显得尤为重要。一个好的程序员至少会把代码写成这个样子:

NSDictionary *ships = [NSDictionary dictionaryWithObjectsAndKeys:
    @"Serenity", @"Firefly",
    @"Enterprise", @"Star Trek",
    @"Executor", @"Star Wars",
nil ];

不管是旧语法还是新语法,就可行性而言,都是可以的。下面的代码演示的是,分别从两种语法中读取值。前面的是新语法,后面的事旧语法。

for (NSString *key in ships) {
    NSLog(@"The ship %@ features in %@", key, ships[key]);
}
for (NSString *key in ships) {
    NSLog(@"The ship %@ features in %@", key, [ships
objectForKey:key]);
}

这里也有一个 NSMutableDictionary 类,就像数组和字符串一样,这个类是允许你去修改它的内容的。它的创建方法也和之前的数据和字符串一样,你可以使用初始化器,或拷贝一个已有的字典。

Objective-C 里是没有元组的,所以字典非常非常常用。当你想从某个方法里,取回多个值时就可以用到字典啦。

results matching ""

    No results matching ""