2013-08-28 56 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

相關問題