2013-08-28 58 views
0

我有一个方法updateUserPlaceDictionary从一些文本字段中绘制文本并将其引发到NSDictionary中。注意到,在字典中的所有值均无效后,我想手动设置一些字符串的钥匙,就像这样: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文件中进行合成。

我有方法记录到控制台的所有位置数据放入字典,但我得到的全部是空值。我在另一个视图控制器中具有完全正确的功能。有人能告诉我他们是否看到任何不正当的事情?

+3

呃,也许你应该实际创建字典? –

回答

9

您有任何意见,说明

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

但你从来没有真正创造它。 初始化字典,你会没事的。

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" 

但较少在性能方面进行了优化(更不用说代码质量)。

+1

高质量的答案。不仅解决了我的问题,而且提供了将来有用的信息。会尝试记住。谢谢哥们! –

2

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

-(NSMutableDictionary *)placeDictionary 
{ 
    if (!_placeDictionary) { 
     _placeDictionary = [NSMutableDictionary dictionary]; 
    } 
    return _placeDictionary; 
} 
+0

初始化方法会更好。 – Chuck

+0

通过这样做,您不必担心在代码中何时何地首先调用它。 – Moxy

+4

通过将它放在'init'中,除非在'init'之前运行代码,否则您也不必担心。而且你不会不必要地使用冗长的getter来膨胀你的代码。 – Chuck

相关问题