如何添加到NSDictionary


91

我当时使用,NSMutableArray并且意识到使用字典对于我要实现的目标要简单得多。

我想在字典NSString中将键另存为,将值另存为int。怎么做?其次,可变字典和普通字典有什么区别?

Answers:


197

一个可变的字典是可以改变的,也就是说,你可以添加和删除对象。一旦创建了一个不可变对象,该对象就是固定的。

创建并添加:

NSMutableDictionary *dict = [[NSMutableDictionary alloc]initWithCapacity:10];
[dict setObject:[NSNumber numberWithInt:42] forKey:@"A cool number"];

并检索:

int myNumber = [[dict objectForKey:@"A cool number"] intValue];

您是否必须使用容量初始化,或者它只是动态的?
muttley91

2
您不必指定初始容量,但如果这样做,可能会看到性能提高。如果您预先知道它将包含多少个项目,请提供此数字或稍大的值。
Eiko

要求NSDictionary不是NSMutableDictionary吗?
阿南塔·普拉萨德

34

通过设置您将使用对象的setValue:(id)value forKey:(id)key方法NSMutableDictionary

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setValue:[NSNumber numberWithInt:5] forKey:@"age"];

或在现代Objective-C中:

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
dict[@"age"] = @5;

可变与“正常”之间的区别是可变性。也就是说,您可以更改NSMutableDictionary(和NSMutableArray)的内容,而不能使用“ normal” NSDictionaryNSArray


2
您不应该将该整数包装在NSNumber中吗?
约翰·库尔

我对此还有一个问题。我需要将用户输入的文本存储为字符串以及用户将文本保存到的图像引用(图像数组中的索引)。我尝试了一个具有2个变量的mutableArray对象,每个变量我刚刚提到过。尝试使用数组对象文本值填充tableView时,效果不佳。所以我想到了字典,唯一的问题是它看起来好像可以按索引检索数据,它必须像哈希图一样是键或值,对吗?
系统

@Johan-正确并更新!@alJaree-是的,字典是各种键值存储。我认为在您的位置上,最好使用一系列字典。像[{image: "/path/to/img/1.jpg", data: "foo bar 1"}, {image: "/path/to/img/2.jpg", data: "foo bar 2"}, ..., {image: "/path/to/img/N.jpg", data: "foo bar N"}]
Eimantas

这对我来说仍然行不通,因为我需要从每个对象中检索文本并使用它来填充收藏夹UITableView,还需要对图像数组的索引引用,以便我可以检索和显示所选的收藏夹图像。我尝试了上面描述的对象,但是当出于某种原因而不是从存储的特定对象读取NSStrings数组时返回了对象。我不确定要在这里做什么
系统

我在想,我可能只需要存储NSString,例如@“%d _%@,index,savedTitle,然后将NSString拆分并取出并付清我需要的东西。 obj c。:)中的split函数
系统2010年

16

每当声明数组时,只有我们必须在NSDictionary中添加键值,例如

NSDictionary *normalDict = [[NSDictionary alloc]initWithObjectsAndKeys:@"Value1",@"Key1",@"Value2",@"Key2",@"Value3",@"Key3",nil];

我们无法在此NSDictionary中添加或删除键值

如在NSMutableDictionary中一样,我们也可以使用此方法在数组初始化之后添加对象

NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]init];'
[mutableDict setObject:@"Value1" forKey:@"Key1"];
[mutableDict setObject:@"Value2" forKey:@"Key2"];
[mutableDict setObject:@"Value3" forKey:@"Key3"];

为了删除键值,我们必须使用以下代码

[mutableDict removeObject:@"Value1" forKey:@"Key1"];

12

更新版本

目标C

创造:

NSDictionary *dictionary = @{@"myKey1": @7, @"myKey2": @5}; 

更改:

NSMutableDictionary *mutableDictionary = [dictionary mutableCopy];     //Make the dictionary mutable to change/add
mutableDictionary[@"myKey3"] = @3;

简称语法称为Objective-C Literals

迅速

创造:

var dictionary = ["myKey1": 7, "myKey2": 5]

更改:

dictionary["myKey3"] = 3

1

您想问的是“可变和不可可变的数组或字典之间有什么区别”。很多时候,这里使用不同的术语来描述您已经知道的事情。在这种情况下,可以将术语“可变”替换为“动态”。因此,可变字典或数组是“动态的”并且可以在运行时更改,而可变字典或数组是“静态的”并且在代码中定义并且在运行时不更改(换句话说)。 ,则不会添加,删除元素或对元素进行排序。)

关于如何完成,您要求我们在此处重复文档。您所需要做的就是搜索示例代码和Xcode文档,以查看其确切执行方式。但是当我第一次学习时,易变的东西也把我扔了,所以我给你!


有时,Xcode文档上没有足够恰当的解释,它进入了深入的理论,没有明确的例子,但并非总是如此,但有时。:P是的,我现在了解可变的部分(可以变异),谢谢。:)
系统2010年

0

作为参考,您还可以利用文字常量initWithDictionary来初始化NSMutableDictionary

NSMutableDictionary buttons = [[NSMutableDictionary alloc] initWithDictionary: @{
    @"touch": @0,
    @"app": @0,
    @"back": @0,
    @"volup": @0,
    @"voldown": @0
}];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.