NSDictionary 拒绝为其键设置值。

Posted

技术标签:

【中文标题】NSDictionary 拒绝为其键设置值。【英文标题】:NSDictionary refuses to set values for its keys. 【发布时间】:2013-08-28 23:58:27 【问题描述】:

我有一个方法updateUserPlaceDictionary,它从一些文本字段中提取文本并将其扔到一个NSDictionary 中。在注意到字典的所有值都为空后,我尝试手动为其键设置一些字符串,如下所示:

- (void)updatePlaceDictionary 
    //Create a dictionary that holds the location data.
    [self.placeDictionary setValue:[NSString stringWithFormat:@"155 Bovet Rd"] forKey:@"Street"];
    [self.placeDictionary setValue:[NSString stringWithFormat:@"san mateo"] forKey:@"City"];
    [self.placeDictionary setValue:[NSString stringWithFormat:@"ca"] forKey:@"State"];
    [self.placeDictionary setValue:[NSString stringWithFormat:@"94402"] forKey:@"ZIP"];

    NSLog(@"%@, %@, %@, %@", [self.placeDictionary objectForKey:@"Street"],
          [self.placeDictionary objectForKey:@"City"],
          [self.placeDictionary objectForKey:@"State"],
          [self.placeDictionary objectForKey:@"ZIP"]);

这是我对placeDictionary的声明:

@property NSMutableDictionary* placeDictionary;

另外,我确实确保在 .m 文件中合成它。

我有方法将所有放入字典的位置数据记录到控制台,但我得到的只是空值。我在另一个完全正常的视图控制器中具有相同的功能。有人能告诉我他们是否看到任何不妥之处吗?

【问题讨论】:

呃,也许你真的应该创建字典?? 【参考方案1】:

你有评论说明

//创建一个保存位置数据的字典。

但您从未真正创建它。 初始化字典,你会没事的。

self.placeDictionary = [NSMutableDictionary dictionary];

还要注意:setValue:forKey:setObject:forKey: 不同。阅读this answer 以了解有关该主题的更多信息,但通常您应该将setObject:forKey: 用于字典,例如

[self.placeDictionary setObject:@"155 Bovet Rd" forKey:@"Street"];

或现代版本的语法:

self.placeDictionary[@"Street"] = @"155 Bovet Rd";

使用 Objective-C 文字实际上可以让整个代码变得更好,看看吧:

self.placeDictionary = @
    @"Street": @"155 Bovet Rd",
    @"City"  : @"san mateo",
    @"State" : @"ca",
    @"ZIP"   : @"94402"
;

请注意,文字语法会产生一个不可变的字典,它可能不适合您的需要。

最后,请不要使用

[NSString stringWithFormat:@"aString"]

因为在语义上等价于

@"aString"

但在性能方面没有优化(更不用说代码质量了)。

【讨论】:

高质量的答案。不仅解决了我的问题,而且提供了将来有用的信息。会努力记住的。谢谢哥们!【参考方案2】:

好像你没有分配,你可以在getter中做。

-(NSMutableDictionary *)placeDictionary

    if (!_placeDictionary) 
        _placeDictionary = [NSMutableDictionary dictionary];
    
    return _placeDictionary;

【讨论】:

一个初始化方法会更好。 通过将其放入init,您也不必担心这一点,除非您在init 之前运行代码。而且你不会用冗长的 getter 不必要地膨胀你的代码。 这就是为什么称为init。您初始化对象状态。 字典不会有所作为,所以它与这个问题无关。但是存在惰性实例化是有原因的。我不得不不同意 init 方法,你不应该仅仅因为那个方法被称为 init 就初始化你所有的对象状态。 @Moxy:当然,延迟初始化存在是有原因的。它对于延迟核心功能不需要的特别昂贵的操作很有用。只是没有任何理由在这里使用它。它所增加的只是冗长和低效。

以上是关于NSDictionary 拒绝为其键设置值。的主要内容,如果未能解决你的问题,请参考以下文章

将 NSDictionary 键排序为 NSDate

设置嵌套的 NSDictionary 和 NSArray 值

根据其键值之一删除 CNContact 数组

从“默认字典”更新值而不删除其键[重复]

打字稿:如何制作接受对象的类型,其键匹配通用但所有值都是值参数的映射函数

如何在字典中提取特定值(仅包含其键的值)